路由没有按预期工作

本文关键字:工作 路由 | 更新日期: 2023-09-27 17:52:45

我正在用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"操作和默认的"Get"操作我放在所有控制器上。为什么它能同时看到这两个动作,即使我明确告诉它要使用哪个动作。路由模板明显不同,分别是"Applications/:id/Targets"answers"Applications"。为什么会弄混呢?

路由没有按预期工作

关于问题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方法。我们将在后面看到一个例子。

我想我已经弄明白了。问题是,当我调用杀虫剂/应用程序/:id/目标url时,它正在工作,但任何其他get都感到困惑,它与上述答案有关。它正在检查任何以"Get"开头并具有类似签名的操作,并且正在查找多个操作。我所做的是给我的默认路由添加一个默认动作"Get",这样它就只在默认路由上使用那个特定的动作。它带走了一些web api路由匹配的功能但它允许在同一个控制器中分离看起来相似但名称不同的动作