2017-04-14 14 views
0

GET、DELETE、POST、およびPUTのメソッドを持つコントローラを持つWeb APIプロジェクトがあります。Wep Api - 405メソッドが許可されていません

このコントローラにPOSTまたはPUTを実行しようとすると、常に405 Method Not Allowedエラーが発生します。送信されるデータは有効に見えますが、これは6つの単純なプロパティを持つオブジェクトです。私は自分のメソッドにブレークポイントを設定し、この場合は期待通りにヒットしません。着信要求と発信応答を検査するためにDelegatingHandler(Web Api - Catch 405 Method Not Allowedに記載)を登録しました。私の要求がApiによって処理されていることがわかります(クライアントに問題がないことを意味します)。私はまた、リクエスト/レスポンスを調べるためにFiddlerを使い、レスポンスヘッダはSecurity:Allow:DELETE、GETの下で言いました。

これは明らかに[HttpPost]属性と[HttpPut]属性で装飾されたメソッドを持っていて、正しく設定されたルーティングを持っていても、PUTとPOSTは許されません。私はデフォルトのルーティングを使用していますが、属性ルーティングを使用するメソッドもあります。

セキュリティ上の問題があるようですが、私は他のコントローラでPOSTとPUTを実行できますが、問題の原因と思われる違いはありません。任意の助けをいただければ幸いです

public class PricesController : ApiController 
{ 
    // DELETE: api/Prices/5 
    [HttpDelete] 
    [ResponseType(typeof(Price))] 
    [Route("api/Prices/{id:int}")] 
    public async Task<IHttpActionResult> DeletePrice(int id) 
    { 
     // code omitted 
    } 

    // GET: api/Prices/5 
    [HttpGet] 
    [ResponseType(typeof(Price))] 
    [Route("api/Prices/{id:int}")] 
    public async Task<IHttpActionResult> GetPrice(int id) 
    { 
     // code omitted 
    } 

    // GET: api/Prices 
    [HttpGet] 
    [Route("api/Prices")] 
    public IQueryable<Price> GetPrices() 
    { 
     // code omitted 
    } 

    // POST: api/Prices 
    [HttpPost] 
    [ResponseType(typeof(Price))] 
    [Route("api/Prices", Name = "Prices")] 
    public async Task<IHttpActionResult> PostPrice(Price price) 
    { 
     // code omitted 
    } 

    // PUT: api/Prices/5 
    [HttpPut] 
    [ResponseType(typeof(void))] 
    [Route("api/Prices/{id:int}")] 
    public async Task<IHttpActionResult> PutPrice(int id, Price price) 
    { 
     // code omitted 
    } 
} 

は、ここに私のコードの抜粋です。私はこれを理解しようと一日中過ごしました。

+0

いくつか確認してください。 WebApiConfigの規則ベースのルートの前に属性のルーティングが有効になっていることを確認してください。 web.configをチェックして、動詞がハンドラ内のパスに許可されていることを確認します。あなたがその行動をどのように呼び出すかも示します。どのURLを使用しますか – Nkosi

+0

属性ルーティングが有効になっています。私はしばらく使用しています。このアプリには56のコントローラがあり、そのほとんどはGET、DELETE、POST、PUT操作をサポートしています。クライアントは、リソースでAngular 1.xを使用しています。これは、この問題が発生していないアプリケーション全体で同様のパターンを使用しています。 – DesertFoxAZ

+0

デバッグヘルプ( "**なぜこのコードは動作しないのですか?**")には、目的の動作、特定の問題またはエラー、およびそれを再現するのに必要な最短コード**を質問**に含める必要があります。 **明確な問題文**のない質問は他の読者には役に立たない。参照:[mcve]を作成する方法。 – Nkosi

答えて

0

正しくバインドされていないようです。

アクションの前に[FromBody]でPriceを飾ってみることはできますか?

PostPrice([FromBody] Price price) 
+0

私はそれを試みましたが、それは違いはありません。私はその属性をアプリケーションの他の場所で使用する必要はありませんでした。私はこの問題を抱えていないかなり類似したコントローラをたくさん持っています。 – DesertFoxAZ

+0

要求のコンテンツタイプがapplication/jsonに設定されていますか? – Eilimint

+0

はい、クライアントアプリケーションはAngular 1.xであり、かなり大きいです。これまですべてが機能していましたが、この特定の機能が欠けていたので追加しています。私はほとんどのアプリケーションを書いたので、私はそれに精通しています。 – DesertFoxAZ

関連する問題