2017-04-14 123 views
0

我有一個帶有控制器的Web Api項目,該控制器具有GET,DELETE,POST和PUT方法。Wep Api - 405方法不允許

當我嘗試對此控制器執行POST或PUT時,我總是收到405方法不允許錯誤。正在發送的數據看起來有效,它只是一個具有六個簡單屬性的對象。我在我的方法中設置了一個斷點,正如預期的那樣,它不會受到影響。我註冊了一個DelegatingHandler(在Web Api - Catch 405 Method Not Allowed處提到)來檢查傳入的請求和傳出響應,我可以告訴我的請求正在被Api處理(意味着問題不在客戶端)。我還使用Fiddler來檢查請求/響應和響應標題,在安全性,允許: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]之前它在你的行動?

PostPrice([FromBody] Price price) 
+0

我試過了,它沒有區別。我不需要在應用程序的其他任何地方使用該屬性。我有很多其他類似的控制器沒有這個問題。 – DesertFoxAZ

+0

請求的內容類型是否設置爲application/json? – Eilimint

+0

是的,客戶端應用程序是Angular 1.x,並且相當大。到目前爲止,一切正常,但這個特殊的功能缺失,所以我加入了它。我寫了大部分的應用程序,所以我對它非常熟悉。 – DesertFoxAZ