2013-06-19 8 views
5

WebApiを含むように更新しようとしているMVCプロジェクトがあります。必要なルートを取得するために、AttributeRoutingを使用しています。 [PUT]以外はすべての呼び出しが正しくルーティングされているように見えますが、405を返します。私はコントローラとアクションを単純化し、[HttpPut]も含めない限り[PUT]でエラーを受け取ります。私が何が欠けているか分からない。AttributeRouting.PUTAttributeを使用している場合は、HttpPutAttributeも含めない限り

[RoutePrefix("api/Sites")] 
    public class SitesController : BaseApiController 
    { 
     [POST("")] 
     public bool CreateSite(SiteSignupArgs args) 
     { 
      ... 
     } 

     [GET("Statuses")] 
     public IList<SiteAuditViewModel> GetStatuses() 
     { 
      ... 
     } 

     [PUT("Statuses/{siteId}")] 
     [HttpPut] // This is required or 405 is returned 
     public HttpResponseMessage UpdateStatus(string siteId, UpdateStatusArgs args) 
     { 
      ... 
     } 

     [DELETE("Statuses/{siteId}")] 
     public HttpResponseMessage Delete(string siteId) 
     { 
      return Request.CreateResponse(HttpStatusCode.OK); 
     } 
} 

バージョンAttributeRouting.Core、AttributeRouting.Core.Http、AttributeRouting.Core.Webの3.5.6、AttributeRouting.WebApi

MVC4

WebDAVがインストールされていません。

答えて

6

予想される動作です。アクション名に「Get」、「Post」、「Put」、「Delete」などの動詞が付いていない場合、Web APIのアクションセレクタはデフォルトで動詞をPOSTとみなします。

、アクションセレクタはHttpGetAttribute、HttpPostAttribute、HttpPutAttributeようSystem.Web.Http名前空間からの属性を探しますので、あなたが[PUT("Statuses/{siteId}")]属性を明示的に指定している場合でも、動作しないなど

AttributeRoutingのPUTAttributeは、上記のタイプのものではないので、アクションセレクタにはありませんこれを考慮して、まだそれがデフォルトのものであると考えています。これはPOSTです。したがって、HttpPut属性の回避策は正しいです。

+0

良い答えですが、 –

+0

@kiran私はこれをはるかに早く見つけたいと思っています。私はこれを理解しようと多くの時間を費やしました。それを確認していただきありがとうございます。 googleの場合: asp.net 405メソッドは許可されていません – dwbartz

関連する問題