[英]Attribute based webapi2 routing returns 404 for some methods
我目前正在開發一個從 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 幫助頁面文檔中也可以使用適當的路由。
盡管一切似乎都設置正確,但我的很多 REST 調用都會導致來自服務器的 404 not found 響應。
我發現了一些特定於 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
失敗。
我一直在戳這個太久了,知道問題是什么嗎?
在任何ASP.NET MVC 路由注冊之前,檢查您是否通過MapHttpAttributeRoutes
方法配置了MapHttpAttributeRoutes
。
根據微軟關於MVC 和 Web API 中的屬性路由的 CodePlex 條目,設計部分指出:
在大多數情況下,首先調用 MapHttpAttributeRoutes 或 MapMvcAttributeRoutes,以便在全局路由之前注冊屬性路由(因此有機會取代全局路由)。 對屬性路由控制器的請求也將被過濾為僅源自屬性路由的請求。
因此,在Global.asax
(或注冊路由的地方)內調用:
GlobalConfiguration.Configure(c => c.MapHttpAttributeRoutes()); // http routes
RouteTable.Routes.MapRoute(...); // mvc routes
就我而言,這是一個愚蠢的錯誤,我發布此信息是為了讓我身后犯同樣錯誤的人可以在他們檢查量子級別的其他所有內容之前閱讀此內容。
我的錯誤是,我的控制器名稱沒有以Controller
一詞結尾。
新年快樂
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.