路由不按预期工作

时间:2014-03-24 23:50:39

标签: c# asp.net asp.net-web-api asp.net-mvc-routing

我正在使用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"动作和默认"获取"行动我把所有控制器。即使我具体告诉它使用哪个动作,为什么它会看到这两个动作。路线模板明显不同于"应用程序/:id / Targets"和#34;应用程序"分别。为什么这些混淆了?

2 个答案:

答案 0 :(得分:1)

关于问题1:

路由引擎是基于约定的,并根据方法名称(操作)确定允许的HTTP谓词。这就是为什么DeleteTargetFromApplication有效的原因。

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

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

  

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

答案 1 :(得分:0)

我想我已经弄明白了。问题是,当我打电话给农药/应用程序/:id / Targets url时,它正在工作,但任何其他GET都变得困惑,它与上述答案有关。它正在检查以“获取”开头并具有类似签名并且正在查找多个的任何操作。我所做的是向我的默认路由添加“Get”的默认操作,以便它只在默认路由上使用该特定操作。它消除了web api路由匹配的一些功能,但它允许在相同的控制器中分离看起来相似但具有不同名称的动作