Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 路由未按预期工作_C#_Asp.net_Asp.net Web Api_Asp.net Mvc Routing - Fatal编程技术网

C# 路由未按预期工作

C# 路由未按预期工作,c#,asp.net,asp.net-web-api,asp.net-mvc-routing,C#,Asp.net,Asp.net Web Api,Asp.net Mvc Routing,我正在用ASP.NETWebAPI创建一个RESTfulAPI,在设置路由时遇到了问题 问题1:我正在尝试设置自定义删除路由。如果我将我的控制器上的操作命名为“DeleteTargetFromApplication”,它将非常有效,但如果我将该操作命名为“RemoveTargetFromApplication”,则会出现“请求的资源不支持http方法‘DELETE’”错误。除了名字,我什么也没改。我使用的路线设置如下: config.Routes.MapHttpRoute(

我正在用ASP.NETWebAPI创建一个RESTfulAPI,在设置路由时遇到了问题

问题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:我有获取、发布、放置、删除和修补的所有默认路由。在默认设置之上,我在设置默认设置的地方创建任何特殊管线。出于某种原因,当我添加:

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”操作。为什么它会看到这两个动作,即使我特别告诉它使用哪一个动作。路由模板明显不同,分别是“应用程序/:id/目标”和“应用程序”。为什么这些会混淆?

关于问题1:

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

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

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


我想我已经弄明白了。问题是,当我调用杀虫剂/Applications/:id/Targets url时,它正在工作,但任何其他GET都被弄糊涂了,这与上面的答案有关。它正在检查以“Get”开头的、具有类似签名的任何操作,并且正在查找多个。我所做的是在我的默认路由中添加一个默认操作“Get”,这样它就只在默认路由上使用那个特定的操作。它去掉了web api路由匹配的一点功能,但允许在同一控制器中分离看起来相似但名称不同的操作

我编辑了您的标题。请参阅“”,其中的共识是“不,他们不应该”。