ServiceStack Routing不适用于查询字符串

Alp*_*per 17 routing servicestack

我有一个使用ServiceStack构建的简单REST服务.

如果我配置这样的路线:

        //register user-defined REST-ful urls
        Routes
            .Add<Contact>("/Contacts")
            .Add<Contact>("/Contacts/{ContactId}")
Run Code Online (Sandbox Code Playgroud)

此请求成功.

http://<server>:59557/Contacts?ContactId=9999 //Works
Run Code Online (Sandbox Code Playgroud)

如果我配置这样的路由(业务分析师更喜欢生成的元数据)

        //register user-defined REST-ful urls
        Routes
            .Add<UpdateContact>("/UpdateContact", "PUT")
            .Add<CreateContact>("/CreateContact", "POST")
            .Add<GetContact>("/Contacts/{ContactId}", "GET")

http://<server>:59557/Contacts/9999           //Works
http://<server>:59557/Contacts?ContactId=9999 //Fails, Handler for request not found
Run Code Online (Sandbox Code Playgroud)

如何在第二个样本中配置路由,以便对/ Contacts?ContactId = 9999的请求成功?

谢谢.

myt*_*thz 34

一些在路由ServiceStack是在解释你的第一个网站解释维基页面:

[Route("/hello/{Name}")]
Run Code Online (Sandbox Code Playgroud)

只匹配:

/hello/name
Run Code Online (Sandbox Code Playgroud)

在哪里:

[Route("/hello")]
Run Code Online (Sandbox Code Playgroud)

火柴:

/hello?Name=XXX
Run Code Online (Sandbox Code Playgroud)

注意:QueryString,FormData和HTTP Request Body不是Route的一部分(即只有/ path/info是),但除了每个Web服务调用之外,它们都可以用于进一步填充Request DTO.

并使用具有通配符路径的路由,如:

[Route("/hello/{Name*}")]
Run Code Online (Sandbox Code Playgroud)

火柴:

/hello
/hello/name
/hello/my/name/is/ServiceStack
Run Code Online (Sandbox Code Playgroud)

何时使用通配符路由的另一个好用例.

所以要匹配/Customers?Key=Value,/Customers/{Id}你需要为这两条路线注册匹配的路线,例如:

Routes
    .Add<GetContact>("/Contacts", "GET")
    .Add<GetContact>("/Contacts/{ContactId}", "GET")
Run Code Online (Sandbox Code Playgroud)

如何为所有服务自动注册基于约定的路由

与此相关的还有通过AddFromAssembly扩展方法注册自动路由,其中此单个调用:

Routes.AddFromAssembly(typeof(MyService).Assembly)
Run Code Online (Sandbox Code Playgroud)

通过并扫描所有服务(在指定的程序集中)并根据您实现的所有HTTP方法注册基于约定的路由.例如,如果您GetContactUpdateContact服务具有Id属性,它将自动注册以下路由:

Routes
    .Add<GetContact>("/Contacts", "GET")
    .Add<GetContact>("/Contacts/{Id}", "GET")
    .Add<UpdateContact>("/Contacts", "POST PUT")
    .Add<UpdateContact>("/Contacts/{Id}", "POST PUT")
Run Code Online (Sandbox Code Playgroud)

如果您只有一个ContactsREST服务,其中包含所有HTTP谓词的实现,它将注册这些路由:

Routes
    .Add<Contacts>("/Contacts", "GET POST PUT DELETE PATCH")
    .Add<Contacts>("/Contacts/{Id}", "GET POST PUT DELETE PATCH")
Run Code Online (Sandbox Code Playgroud)

路由解析顺序

这在New API Design wiki中有更详细的描述,但用于选择路由的权重基于:

  1. 首先使用任何精确的文字匹配
  2. 精确动词匹配优于所有动词
  3. 路线中的变量越多,其权重就越小
  4. 当路由具有相同的权重时,顺序由服务中的操作位置或注册顺序(FIFO)确定

有关示例,请参阅Wiki上的" 智能路由"部分.

很好的表现;很好的绩效

由于当您拥有大量路由时,MVC中的路由可能会很慢,我认为值得指出ServiceStack的路由实现是使用哈希查找实现的,因此不会遇到MVC可能存在的线性性能回归问题.