2012-06-12 169 views
5

Web api似乎只适用于标准用例。 但我想做更复杂的路由,但找不到复杂路由的文档。 如果我有更多的控制器,路由会变得越来越复杂。ASP.NET 4 MVC Web API:复杂路由的文档

我可以用依赖性定义几个可选参数吗? 像这样:

/api/document/{par1}/{par2} 

PAR1 & par2的应该是可选的,但应该PAR2 PAR1是否存在只匹配。

而递归参数可能吗?

/api/documents/characteristics/{round/green/red-dots} 
/api/documents/characteristics/{square/yellow} 
/api/documents/characteristics/{square/yellow/flat} 
/api/documents/characteristics/{square/yellow/flat/...} 

有没有web api路由的详细文档?微软的教程太简单了...... 我需要更多关于路由的信息。

我有两个控制器和一些麻烦,因为两个路由非常相似,所以采取了错误的路线。我可以使用[动作] - 属性作为解决方法,但这种感觉不正确...我也必须考虑路线的顺序。这是合乎逻辑的,但没有提到。 Web api仅适用于简单的休息API吗?


编辑: 我尝试这样做:

routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{mandant}/documents/{id}", 
      defaults: new { controller = "documents", id = RouteParameter.Optional } 
      ); 

//routes.MapHttpRoute(
// name: "DefaultApiWithAction", 
// routeTemplate: "api/{mandant}/documents/{id}/{action}", 
// defaults: new { controller = "documents" } 
// ); 

我有两种方法:

[AcceptVerbs("get")] 
public HttpResponseMessage Get(int id) 

[ActionName("file")] 
[AcceptVerbs("get")] 
public HttpResponseMessage filedownload(int id) 

现在我有问题,该文件的动作被触发,即使我注释掉第二条路线和正常的获取特定的文档方法不会被触发,因为多个动作...我尝试了[NoAction]属性,但是这个我s不工作... 但是,如果route-template中没有任何操作,为什么会触发file-method? (或者如果第二条路线是活动的,为什么正常的get-document方法不会被触发,如果网址中没有动作......) 我目前的解决方法是为所有其他方法设置默认行为,但这不是一个好的解决方案。

回答

8

您可以使用路由限制设置路由的条件在Global.asax中,如:

routes.MapRoute(
    "ApiRoute", 
    "api/document/{par1}/{par2}", 
    new {controller="Document", action="SomeMethod"}, 
    new {par1 = @"\d+" } 
); 

在最后一个参数,你可以指定有指定的参数进行匹配的路线是正则表达式用过的。在上述par1的例子仅用于数字,但你可以使用任何正则表达式,如:

routes.MapRoute(
    "ApiRoute", 
    "api/document/{par1}/{par2}", 
    new {controller="Document", action="SomeMethod"}, 
    new {par1 = @"(value1|value2|value3)" } 
); 
+0

设置控制器的静态默认应该处理的路线冲突。你可以使用约束对我来说是新的。谢谢。一个好的web api路由的微软文档将会很棒。我还发现你可以使用*作为catch-all参数,像这样{* param},但它必须在url的末尾。 – user437899

+2

我发现了asp.net路由的通用文档:http://msdn.microsoft.com/en-us/library/cc668201.aspx – user437899