2016-05-30 89 views
2

我裝飾了我的API控制器,如:WebApi2 RoutePrefix和端點路由=未找到

[RoutePrefix("api/admin/notification")] public class LanguageController : BaseController

裏面,我有這樣的GET端點:

[HttpGet] 
[Route("app/{productGuid}")] 
public async Task<IHttpActionResult> GetAllNotificationsForApp([FromUri]string productGuid) 

現在,我假設正確的方式訪問此資源是:

GET http://[api-url]/api/admin/notification/app/someguid

然而,這會產生一個404

我曾嘗試:

的拆卸,[FromUri]

-Passing productGuid作爲查詢字符串的一部分,即.../app?productGuid=something(相對於/app/{productGuid}

是,我正在使用config.MapHttpAttributeRoutes();,並且我已驗證其他也使用RoutePrefix工作的api控制器。

我錯過了什麼嗎?

+0

'[FromUri]'用於強制網絡API來讀取從URI的複雜類型。刪除它應該已經工作。您還可以考慮將參數從'string'更改爲'Guid',並對路徑中的佔位符應用適當的約束。即:'[Route(「app/{productGuid:guid}」)]' – Nkosi

回答

1

原來你不能有兩個具有相同類名的API控制器,即使它們映射到不同的路由。

我有另一個控制器名爲LanguageController,在不同的命名空間和映射到不同的路線;我不得不重新命名其中一個才能使其工作。

基於Different RoutePrefix, same controller name

1

[FromUri]用於強制Web API從URI讀取複雜類型。刪除它應該已經工作。

您還可以查看將參數從string更改爲Guid並將適當的約束應用於路徑中的佔位符。即:[Route("app/{productGuid:guid}")]

[RoutePrefix("api/admin/notification")] 
public class LanguageController : BaseController { 
    //GET: api/admin/notification/app/{guid} 
    [HttpGet] 
    [Route("app/{productGuid:guid}")] 
    public async Task<IHttpActionResult> GetAllNotificationsForApp(Guid productGuid) {...} 

} 

其他檢查事項:

確保config.MapHttpAttributeRoutes();是您的基於約定的路由之前完成。當第一場比賽勝出時,順序非常重要。

public static class WebApiConfig { 
    public static void Register(HttpConfiguration config) { 
     // Attribute routing. 
     config.MapHttpAttributeRoutes(); 

     // Convention-based routing. 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 
+0

感謝您的回答,我指出了我的問題的原因。 – Carlitrosss

+0

@Carlitrosss,是的。有時候會發生。很高興你能夠事先弄清楚問題所在。快樂編碼! – Nkosi