Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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
Asp.net web api 如何将同一url上的不同HTTP方法映射到不同的控制器?_Asp.net Web Api_Attributerouting_Http Method - Fatal编程技术网

Asp.net web api 如何将同一url上的不同HTTP方法映射到不同的控制器?

Asp.net web api 如何将同一url上的不同HTTP方法映射到不同的控制器?,asp.net-web-api,attributerouting,http-method,Asp.net Web Api,Attributerouting,Http Method,由于API中JSON数据的大小写(外部)要求(一些请求应该使用camelCasing,而其他请求应该使用PascalCasing),我将应用程序的一小部分API拆分为两个控制器 现在,我有一个url,我想用PascalCasing映射GET,而不是PUT,因此我尝试了以下方法: [PascalCasing]//自定义属性,我们代码的一部分 //我们配置所有*没有*使用此功能的控制器 //骆驼套 公共类控制器:ApiController { [HttpGet] [路由(“url/to/my/res

由于API中JSON数据的大小写(外部)要求(一些请求应该使用camelCasing,而其他请求应该使用PascalCasing),我将应用程序的一小部分API拆分为两个控制器

现在,我有一个url,我想用PascalCasing映射
GET
,而不是
PUT
,因此我尝试了以下方法:

[PascalCasing]//自定义属性,我们代码的一部分
//我们配置所有*没有*使用此功能的控制器
//骆驼套
公共类控制器:ApiController
{
[HttpGet]
[路由(“url/to/my/resource/{id}”)]
公共IHttpActionResult(内部id)
{
返回Ok(GetResource(id));
}
}
公共类CamelCasedController:ApiController
{
[HttpPut]
[路由(“url/to/my/resource/{id}”)]
公共IHttpActionResult(int id,资源)
{
SaveResource(id,resource);
返回Ok();
}
}
GET
请求按预期工作,但是如果我尝试用Fiddler将
东西放到那里,我会收到以下错误消息:

找到多个与URL匹配的控制器类型。如果多个控制器上的属性路由与请求的URL匹配,则可能发生这种情况。
请求已找到以下匹配的控制器类型:
MyProject.PascalCaseController
MyProject.CamelCaseController


我意识到这可能是因为WebAPI首先将路由映射到控制器,然后映射到操作,但如果考虑HTTP方法,这里就没有任何歧义。有什么方法可以告诉WebAPI如何做到这一点,而不必在同一个控制器中使用这些方法吗?

@Tomas-System.Web.Http.Dispatcher.IHttpControllerSelector中公开了一个接口。您可以使用该接口创建自己的HttpControllerSelector。然后,在区域注册期间,您可以在HttpConfiguration中使用自定义控制器选择器替换DefaultControllerSelector

替换(typeof(IHttpControllerSelector)、新CustomControllerSelector(Services.GetHttpControllerSelector())

在这个自定义控制器选择器中,您可以编写自己的IHttpControllerSelector的SelectController()方法实现,在其中可以调用IHttpControllerSelector的GetControllerMapping()方法。这将为您提供所有已注册控制器的列表。对于每个控制器,您可以检查DeclaredMethods,并检查每个DeclaredMethods的CustomAttribute。在您的情况下,它将是HttpGetAttribute或HttpPutAttribute

检查传入HttpRequestMessage(GET/PUT)的方法类型,并将其与CustomAttributes的值进行比较。如果找到传入请求URL和相应Http谓词组合的匹配项,则获取该HttpControllerDiscriptor并从SelectController()方法返回它


这将允许您在两个不同的控制器中使用相同的URL和不同的方法。

我从未设法解决过这个问题,而是最终合并了两个控制器。如果有人对如何做到这一点有好的想法,我很乐意为此颁发风滚草徽章!彼此彼此。悲哀的是,一个控制器需要不同于另一个控制器的依赖关系,现在所有依赖关系都注入到一个控制器中:-(有人知道最终是否有办法解决这个问题吗?我正要合并控制器,但我想至少提出一个问题以防万一……谢谢!我还没有尝试过这个方法。)(因为这个问题已经问了几年了,我只是求助于使用分部类,然后继续…)但这种方法似乎可行,所以我还是给你一个代表:)