簡體   English   中英

對於某些方法,基於屬性的 webapi2 路由返回 404

[英]Attribute based webapi2 routing returns 404 for some methods

我目前正在開發一個從 Webapi 升級到 Webapi2 的項目。 部分轉換包括切換到使用基於屬性的路由。

我已經在 Global.asax 中適當地設置了我的路線(如下)

 GlobalConfiguration.Configure(config => config.MapHttpAttributeRoutes());

並刪除了之前的路由配置。

我已經用適當的System.Web.Http.RouteAttributeSystem.Web.Http.RoutePrefixAttribute屬性裝飾了我所有的 API 控制器。

如果我使用調試器檢查System.Web.Http.GlobalConfiguration.Configuration.Routes ,我可以看到我所有預期的路由都在集合中注冊。 同樣,在包含的生成的Webapi 幫助頁面文檔中也可以使用適當的路由。

盡管一切似乎都設置正確,但我的很多 REST 調用都會導致來自服務器的 404 not found 響應。

我發現了一些特定於 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方法配置了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM