2013-03-30 45 views
55

這個錯誤是很常見的,我嘗試了所有的解決方案,而不是他們的工作。我在控制面板中禁用WebDAV發佈,並將此向我​​的網絡配置文件:405方法不允許web api

<handlers> 
    <remove name="WebDAV"/> 
    </handlers> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <remove name="WebDAVModule"/> 
    </modules> 

錯誤仍然存​​在。這是控制器:

static readonly IProductRepository repository = new ProductRepository(); 

    public Product Put(Product p) 
    { 
     return repository.Add(p); 
    } 

方法實現:

public Product Add(Product item) 
    { 
     if (item == null) 
     { 
      throw new ArgumentNullException("item"); 
     } 
     item.Id = _nextId++; 
     products.Add(item); 
     return item; 
    } 

而這正是引發異常:

client.BaseAddress = new Uri("http://localhost:5106/"); 
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));  
var response = await client.PostAsJsonAsync("api/products", product);//405 exception 

有什麼建議?

回答

39

您從客戶張貼:

await client.PostAsJsonAsync("api/products", product); 

不PUTing。

您的Web API方法只接受PUT請求。

所以:

await client.PutAsJsonAsync("api/products", product); 
2

這不回答你的具體問題,但是當我有同樣的問題,我在這裏結束了,我計算過,更多的人可能會做同樣的。

我遇到的問題是我不經意地宣佈我的Get方法爲靜態。我錯過了整個上午,並沒有引起任何屬性或類似的警告。

錯誤:

public class EchoController : ApiController 
{ 
    public static string Get() 
    { 
     return string.Empty; 
    } 
} 

正確:

public class EchoController : ApiController 
{ 
    public string Get() 
    { 
     return string.Empty; 
    } 
} 
48

我有同樣的例外。我的問題是,我用了:

using System.Web.Mvc; // Wrong namespace for HttpGet attribute !!!!!!!!! 
[HttpGet] 
public string Blah() 
{ 
    return "blah"; 
} 

using System.Web.Http; // Correct namespace for HttpGet attribute !!!!!!!!! 
[HttpGet] 
public string Blah() 
{ 
    return "blah"; 
} 
+1

不斷讓我這一個! – Rick

+0

這解決了我的問題。謝謝... – Ziggler

+0

這解決了我的MVC API屬性不起作用。謝謝! – Alexei

8

我的問題竟然是在的WebAPI屬性的路由。我創建了一個自定義路由,它對待它就像發現它是一個POST

[Route("")] 
    [HttpPost] //I added this attribute explicitly, and it worked 
    public void Post(ProductModel data) 
    { 
     ... 
    } 

一個GET代替的WebAPI我知道它是什麼愚蠢的(消耗你一整天)

1

[HttpPost]是不必要的!

[Route("")] 
public void Post(ProductModel data) 
{ 
    ... 
} 
+0

是的,你這樣做的方式是正確的,你不需要一個明確的[HttpPost],但是有一些人不遵循約定(yikes),因此像[Route(「MyMethodSaver」]公共字符串MyMethodtoSave(int ?]這將需要一個[HttpPost],然後它會工作 –

16

我嘗試過很多事情讓DELETE方法的工作(我得到405方法不被允許網頁API),最後我說[路線(「API /掃描/(編號)」)我控制器,工作正常。 希望這篇文章有助於某人。

 // DELETE api/Scan/5 
    [Route("api/scan/{id}")] 
    [ResponseType(typeof(Scan))] 
    public IHttpActionResult DeleteScan(int id) 
    { 
     Scan scan = db.Scans.Find(id); 
     if (scan == null) 
     { 
      return NotFound(); 
     } 

     db.Scans.Remove(scan); 
     db.SaveChanges(); 

     return Ok(scan); 
    } 
+0

由於某種原因,我只是不工作的刪除,創建和更新它工作正常。嗯,我只是添加了[HttpPost]和它但是謝謝,你讓我走上了正軌,只花了我5分鐘:) – Rubenisme

+0

爲什麼你不加入[HttpDelete]屬性? –

4

,我在我的GET調用獲取405,問題原來,我命名的GET服務器端方法Get(int formId)的參數,我需要改變路線,或將其重命名Get(int id)

4

Chrome經常在嘗試發帖之前嘗試執行OPTIONS通話。它這樣做是爲了確保CORS標題是有序的。如果您沒有在您的API控制器中處理OPTIONS調用,則可能會出現問題。

public void Options() { } 
+0

這是我的問題,謝謝!你促使我檢查請求,並且這是OPTIONS調用失敗的原因 –

4

如果說你的方法需要一個參數而你沒有通過,你也可以得到405錯誤。

這不起作用(405錯誤)

HTML查看/ JavaScript的

$.ajax({ 
     url: '/api/News', 
     //..... 

的Web API:

public HttpResponseMessage GetNews(int id) 

因此,如果方法簽名就好上面那麼你必須這樣做:

查看HTML/JavaScript的

$.ajax({ 
     url: '/api/News/5', 
     //..... 
+0

由於各種原因,我似乎遇到了405錯誤,它們都歸結爲它嘗試HIT方法簽名和一個事實參數問題或約定命名問題或屬性問題等...... –

1

我沒法解決這個問題。只要POST返回void(ASP.NET 4.0 - WEBAPI 1),我就啓用了CORS並工作。當我試圖返回一個HttpResponseMessage時,我開始獲得HTTP 405響應。

根據Llad的回答,我看了一下自己的參考資料。

我有我的POST方法上面列出的屬性[System.Web.Mvc.HttpPost]。

我改變了這種使用方法:

[System.Web.Http.HttpPostAttribute] 
[HttpOptions] 
public HttpResponseMessage Post(object json)   
{ 
    ... 
    return new HttpResponseMessage { StatusCode = HttpStatusCode.OK }; 
} 

這個固定我的困境。我希望這可以幫助別人。

爲了完整起見,我在我的web.config中的以下內容:

<httpProtocol> 
    <customHeaders> 
     <clear /> 
     <add name="Access-Control-Expose-Headers " value="WWW-Authenticate"/> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, PATCH, DELETE" /> 
     <add name="Access-Control-Allow-Headers" value="accept, authorization, Content-Type" /> 
     <remove name="X-Powered-By" /> 
    </customHeaders> 
</httpProtocol> 
2

,我遲到了這個黨,但如無上述要麼是活的或在大多數情況下工作,這裏是如何這終於爲我解決了。

在站點/服務託管的服務器上,需要一項功能! HTTP激活!

服務器管理器>管理>添加角色和功能>下一個下一個下一個,直到您到達功能>在.NET(每個版本)下勾選HTTP激活。 另請注意,有一個隱藏在>網> WCF服務。

然後,這即刻工作! 那是融化了我的大腦在你的項目

0

檢查的.csproj文件,並更改

<IISUrl>http://localhost:PORT/</IISUrl> 

到您的網站的網址是這樣

<IISUrl>http://example.com:applicationName/</IISUrl> 
0

另一個可能的問題,這會導致相同的行爲是默認參數在路由。在我的情況下,控制器位於和正確實例,但POST被阻止,因爲指定默認Get行動:

config.Routes.MapHttpRoute(
    name: "GetAllRoute", 
    routeTemplate: "api/{controller}.{ext}"/*, 
    defaults: new { action = "Get" }*/ // this was causing the issue 
); 
3

如果你有一個像

[Route("nuclearreactors/{reactorId}")] 

您需要使用完全相同的路線方法中的參數名稱例如

public ReactorModel GetReactor(reactorId) 
{ 
... 
} 

如果不通過完全相同的參數,您可能會收到錯誤「405方法不允許」,因爲該路線將不匹配的請求,並會的WebAPI擊中不同的允許HTTP方法不同的控制器方法。

+0

這也不是一個答案! –

+0

@Div「405方法不允許」可以在我共享的情況下顯示,因爲該方法無法捕捉API呼叫,因爲路由設置無效。然後,API調用可能會碰到另一種意想不到的方法,該方法可能會允許不同的HTTP操作。是的,我同意這個答案可能與實際問題不是100%相關,但是Xardas提出的問題的標題並不是非常具體,我相信很多人在此尋找標題所述問題的答案找到這個有用的答案。 – roylac

1

這裏是一個解決方案

<handlers accessPolicy="Read, Script"> <remove name="WebDAV" /> </handlers>

docs.microsoft.com solution article

和刪除的WebDAV從模塊

<remove name="WebDAVModule" />

1

當您嘗試同時連接到http也會出現此錯誤服務器在https上。

這有點令人困惑,因爲我的請求沒問題,問題只出現在post-requests中。