2015-09-01 88 views
4

我有一個的WebAPI控制器ASP.NET的WebAPI返回的HTTP 405

[RoutePrefix("api/invitations")] 
public class InvitationsApiController : ApiController 

和動作方法:

[Route] 
[HttpPost] 
public IHttpActionResult Create([FromBody] CreateCommand command) 

當我嘗試發佈到http://host/api/invitations,我收到了「「405不允許的方法」

但是當我使用另一條路線,如:

[Route("test")] 
[HttpPost] 
public IHttpActionResult Create([FromBody] CreateCommand command) 

WebApiConfig.cs

public static void Register(HttpConfiguration config) 
{ 
    // Web API configuration and services 
    SetupFormatters(config); 

    // Web API routes 
    config.MapHttpAttributeRoutes(); 

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

而發表的帖子中http://host/api/invitations/test其工作。我有控制器,在請求「root」時完美工作。在HTTP錯誤

更多細節:

HTTP Error 405.0 - Method Not Allowed The page you are looking for cannot be displayed because an invalid method (HTTP verb) is being used.

Detailed Error Information: 
Module DefaultDocumentModule 
Notification ExecuteRequestHandler 
Handler StaticFile Error 
Code 0x80070001 
Requested URL http://localhost:8008/api/invitations 
Physical Path <removed> 
Logon Method Anonymous 
Logon User Anonymous 

任何建議可能是什麼問題?

+1

你有路線衝突嗎? 2種方法以相同的方式裝飾? –

+0

你恰好在'〜/ api/invitations'路徑中有物理/虛擬目錄嗎?否則,你將不得不顯示你的'Web.Config' ... – haim770

+2

從你的方法中刪除[Route]屬性或將其更改爲[Route(「」)] – HaukurHaf

回答

2

的問題是,你有那是匹配你的路線物理目錄(/api/invitations )。因爲存在這樣的物理目錄,所以IIS DirectoryListingModuleDefaultDocumentModule模塊(不允許使用POST動詞)將在TransferRequestHandler(由MVC和WebAPI使用)能夠處理它之前接管請求。

沒有理由將InvitationsController.cs放在與要求的路由匹配的目錄結構中。這就是爲什麼我們首先進行路由選擇,以便能夠動態註冊路由,而不管控制器的物理位置如何。

公共約定(也是默認的WebAPI模板結構)是將您的控制器放在~/Controllers目錄(或~/Controllers/Api)中。但只要將它們作爲項目的一部分進行編譯,就可以將它們放在任何目錄中。

+0

這就像一個魅力=)實際上很明顯,當解釋。謝謝! –

+1

這正是我發生的事情。我展開了目錄結構並開始工作。謝謝! – K0D4

2

在控制器級別更改控制器RoutePrefix聲明Route

[Route("api/invitations")] 
public class InvitationsApiController : ApiController 

RoutePrefix路由不添加到路由表。這意味着,如果你想使用RoutePrefix,你必須通過自己的前綴每個動作,例如:

[RoutePrefix("api/invitations")] 
public class InvitationsApiController : ApiController 

[Route("")] 
[HttpPost] 
public IHttpActionResult Create([FromBody] CreateCommand command) 
+1

是的,但它與返回錯誤無關 – haim770

+0

@ haim770您嘗試[Route(「」)]而不是[Route]嗎? –

+0

我嘗試了你的建議,但有同樣的錯誤。 –