对于某些方法,基于属性的webapi2路由返回404
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于某些方法,基于属性的webapi2路由返回404相关的知识,希望对你有一定的参考价值。
我目前正在开发一个已从Webapi升级到Webapi2的项目。部分转换包括切换到使用基于属性的路由。
我在Global.asax中设置了我的路线(如下)
GlobalConfiguration.Configure(config => config.MapHttpAttributeRoutes());
并删除了以前的路由配置。
我使用适当的System.Web.Http.RouteAttribute和System.Web.Http.RoutePrefixAttribute属性装饰了所有API控制器。
如果我使用调试器检查System.Web.Http.GlobalConfiguration.Configuration.Routes,我可以看到所有我期望的路由都在集合中注册。同样,所包含的生成的Webapi Help Page文档中提供了适当的路由。
即使所有似乎都设置正确,我的REST调用数量也会导致服务器发现404未找到响应。
我发现了一些与GET方法相关的显着相似之处(这是迄今为止我测试的所有内容)
- 如果方法接受0参数,它将失败
- 如果路由覆盖前缀,则会失败
- 如果方法采用字符串参数,则可能会成功
- 返回类型似乎没有影响
- 命名路线似乎没有任何影响
- 订购路线似乎没有任何影响
- 重命名基础方法似乎没有任何影响
值得注意的是,我的API控制器出现在一个单独的区域,但考虑到某些路由可行,我不认为这是手头的问题。
非功能方法调用的示例
[RoutePrefix("api/postman")]
public class PostmanApiController : ApiController
{
...
[HttpGet]
[Route("all", Name = "GetPostmanCollection")]
[ResponseType(typeof (PostmanCollectionGet))]
public IHttpActionResult GetPostmanCollection()
{
return Ok(...);
}
...
}
我希望这可以通过http://[application-root]/api/postman/all
获得
有趣的是打电话给
Url.Link("GetPostmanCollection", null)
将返回上述预期的网址
一个非常相似的方法调用示例在同一个控制器中调用,其中一些工作,一些不工作。
[RoutePrefix("api/machine")]
public class MachineApiController : ApiController
{
...
[HttpGet]
[Route("byowner/{owner}", Name = "GetPostmanCollection")]
public IEnumerable<string> GetByOwner([FromUri] string owner)
{
...
}
...
[HttpGet]
[Route("~/api/oses/{osType}")]
public IEnumerable<OsAndVersionGet> GetOSes([FromUri] string osType)
{
...
}
...
}
如果对http://[application-root]/api/machineby/ownername
的调用成功,而http://[application-root]/api/oses/osType
没有成功。
我一直在讨论这个问题太久了,不知道问题可能是什么?
在任何ASP.NET MVC路由注册之前,请检查是否通过MapHttpAttributeRoutes
方法配置了HttpConfiguration。
根据微软在Attribute Routing in MVC and Web API上的CodePlex条目,设计部分指出:
在大多数情况下,首先调用MapHttpAttributeRoutes或MapMvcAttributeRoutes,以便在全局路由之前注册属性路由(因此有机会取代全局路由)。属性路由控制器的请求也将仅过滤到源自属性路由的请求。
因此,在Global.asax
(或注册路线)内,可以致电:
GlobalConfiguration.Configure(c => c.MapHttpAttributeRoutes()); // http routes
RouteTable.Routes.MapRoute(...); // mvc routes
在我的情况下,这是一个愚蠢的错误,我发布这个,所以我背后的人犯了同样的错误,在他们检查量子级别的其他所有内容之前。
我的错误是,我的控制器的名字并没有以Controller
这个词结束。
新年快乐
以上是关于对于某些方法,基于属性的webapi2路由返回404的主要内容,如果未能解决你的问题,请参考以下文章