5

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

    [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);
        }
}

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

MVC4

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

4

1 に答える 1

6

表示されているのは、予期される動作です。Web API のアクション セレクターはPOST、アクション名に "Get"、"Post"、"Put"、"Delete" などの動詞のプレフィックスがない場合、アクションが動詞であると見なします。

属性を明示的に指定しても機能しません。これは[PUT("Statuses/{siteId}")]、アクション セレクターがSystem.Web.HttpHttpGetAttribute、HttpPostAttribute、HttpPutAttribute などの名前空間から属性を検索するためです。

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

于 2013-06-19T17:00:49.583 に答える