2014-03-24 56 views
0

我使用ASP .NET Web Api创建了一个restful api,我在设置路由时遇到了问题。路由不能按预期工作

问题1:我正在尝试设置自定义删除路线。如果我在我的控制器“DeleteTargetFromApplication”上命名我的操作,它可以很好地工作,但如果我将操作命名为“RemoveTargetFromApplication”,它会给我一个“请求的资源不支持http方法'DELETE'”错误。除了名字,我什么都不改变。我使用的路线是这样设置的:

config.Routes.MapHttpRoute(
       name: "PesticideRemoveTargetFromApplication", 
       routeTemplate: "Pesticide/Applications/{id}/Targets/{targetId}", 
       defaults: new { controller = "Applications", action = "DeleteTargetFromApplication" }, 
       constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Delete) } 
      ) 

有没有我没有得到关于Web Api如何匹配路线?

问题2:我有Get,Post,Put,Delete,Patch的所有默认路由。在默认值上面,我在上面创建了默认设置的任何特殊路由。出于某种原因,当我添加:

config.Routes.MapHttpRoute(
       name: "PesticideGetTargetsForApplication", 
       routeTemplate: "Pesticide/Applications/{id}/Targets", 
       defaults: new { controller = "Applications", action = "GetTargetsForApplication" }, 
       constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) } 
      ); 

默认值以上,这是说我有匹配的“GetTargetsForApplication”行动和默认的“获取”行动我把所有控制器上两个动作。为什么看到这两种行为,即使我具体告诉它要使用哪个动作。路线模板明显不同于“Applications /:id/Targets”和“Applications”。为什么这些混合起来?

+0

我已编辑您的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

回答

1

在问题1:

路由引擎是基于惯例和从方法(作用)名确定的允许HTTP谓词。这就是为什么DeleteTargetFromApplication有效。

一个简单的解决方法是将[HttpDelete]添加到RemoveTargetFromApplication的定义中。

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

要查找的动作,网络API着眼于HTTP方法,然后寻找一个动作名称以该HTTP方法名。例如,通过GET请求,Web API将查找以“Get ...”开头的操作,例如“GetContact”或“GetAllContacts”。此惯例仅适用于GET,POST,PUT和DELETE方法。您可以通过使用控制器上的属性来启用其他HTTP方法。我们稍后会看到一个例子。

0

我想我已经想通了。问题是,当我调用Pesticide/Applications /:id/Targets url时,它正在工作,但任何其他GET都变得困惑,并且它与上面的答案有关。它正在检查以“Get”开头的任何操作,并且具有类似的签名并且找到了多个操作。我所做的是向我的默认路由添加“Get”的默认操作,以便它仅在默认路由上使用该特定操作。它带走了web api路由匹配的一小部分功能,但它允许在同一控制器中分离类似但具有不同名称的动作