我目前正在开发一个已从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方法相关的显着相似之处(这是迄今为止我所测试的所有内容)
值得注意的是,我的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
的调用不成功。
我一直在讨论太长时间,不知道问题可能是什么?
答案 0 :(得分:12)
检查在任何 ASP.NET MVC路由注册之前,通过MapHttpAttributeRoutes
方法配置HttpConfiguration。
根据Microsoft在Attribute Routing in MVC and Web API上的CodePlex条目设计部分说明:
在大多数情况下,MapHttpAttributeRoutes或MapMvcAttributeRoutes将是 首先调用,以便在全局之前注册属性路由 路线(因此有机会取代全球路线)。 属性路由控制器的请求也将被过滤到 只有那些来自属性路线的那些。
因此,在Global.asax
(或注册路线)中,调用:
GlobalConfiguration.Configure(c => c.MapHttpAttributeRoutes()); // http routes
RouteTable.Routes.MapRoute(...); // mvc routes
答案 1 :(得分:5)
在我的情况下,这是一个愚蠢的错误,我发布这个,所以我背后的人犯同样的错误,在他们检查量子级别的其他所有内容之前就读了这个。
我的错误是,我的控制器名称并未以Controller
一词结尾。