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方法注册基于约定的路由.例如,如果您GetContact和UpdateContact服务具有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中有更详细的描述,但用于选择路由的权重基于:
有关示例,请参阅Wiki上的" 智能路由"部分.
由于当您拥有大量路由时,MVC中的路由可能会很慢,我认为值得指出ServiceStack的路由实现是使用哈希查找实现的,因此不会遇到MVC可能存在的线性性能回归问题.
| 归档时间: |
|
| 查看次数: |
7929 次 |
| 最近记录: |