2016-09-20 65 views
4

工作,我用屬性路由,但是當我指定一個空Route屬性我得到以下錯誤:的ASP.NET Web API控制器不無路由名稱

405.0 - Method Not Allowed

然而,如果我在屬性中添加一個路由名稱,如[Route("bar")],則一切按預期工作。

爲什麼這些操作方法之一按預期工作,而另一個會產生錯誤?

[System.Web.Http.RoutePrefix("foo")] 
public partial class MyController : ApiController 
{ 
    [System.Web.Http.HttpPost] 
    [System.Web.Http.Route("bar")] // I am able to POST to /foo/bar 
    public async Task<MyResponseModel> BarMethod([FromBody]MyArgumentsModel arguments) 
    { 

    } 

    [System.Web.Http.HttpPost] 
    [System.Web.Http.Route] // Error when I POST to /foo, "Method Not Allowed" 
    public async Task<MyResponseModel> FooMethod([FromBody]MyArgumentsModel arguments) 
    { 

    } 
} 

任何想法我可能會失蹤?

+0

你並不需要使用[System.Web程序.Http.Route。只需將其刪除,該方法將繼承控制器路由。 –

回答

1

屬性的路由可以與基於慣例路由相結合。 要定義基於約定的路由,請調用MapHttpRoute方法。

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

感謝您的幫助!儘管我已經有了這個確切的配置。 :) –

+0

@TedNyberg然後嘗試重新命名'FooMethod'到'POST' – giammin

+0

我之前試過了,但它並沒有區別。 :/謝謝! –

2

您需要在以便它作爲默認路由使用路由前綴時,工作一個空字符串的路由屬性[Route("")]

下面的文章顯示了它是如何做

來源:Attribute Routing in ASP.NET Web API 2

建議的更改的結果是這樣的

[RoutePrefix("foo")] 
public partial class MyController : ApiController { 
    //eg POST foo/bar 
    [HttpPost] 
    [Route("bar")] 
    public async Task<MyResponseModel> BarMethod([FromBody]MyArgumentsModel arguments) { 
     //... 
    } 

    //eg POST foo  
    [HttpPost] 
    [Route("")] 
    public async Task<MyResponseModel> FooMethod([FromBody]MyArgumentsModel arguments) { 
     //... 
    } 
} 
+0

感謝您的幫助!但是,添加空字符串會得到相同的結果。 :/ –

+0

查看答案中的文章中的例子。 – Nkosi

相關問題