[英]405 method not allowed Web API
這個錯誤很常見,我嘗試了所有的解決方案,但沒有一個有效。 我在控制面板中禁用了 WebDAV 發布並將其添加到我的 web 配置文件中:
<handlers>
<remove name="WebDAV"/>
</handlers>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
錯誤仍然存在。 這是 controller:
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
有什么建議么?
您正在從客戶端發布:
await client.PostAsJsonAsync("api/products", product);
不放。
您的 Web API 方法僅接受 PUT 請求。
所以:
await client.PutAsJsonAsync("api/products", product);
我有同樣的例外。 我的問題是我曾經使用過:
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";
}
我嘗試了很多方法來讓 DELETE 方法工作(我得到了 405 方法不允許 web api),最后我將[Route("api/scan/{id}")] 添加到我的控制器並且工作正常。 希望這篇文章對某人有所幫助。
// 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);
}
我的問題原來是 WebAPI 中的屬性路由。 我創建了一個自定義路由,它把它當作一個 GET 而不是 WebAPI 發現它是一個 POST
[Route("")]
[HttpPost] //I added this attribute explicitly, and it worked
public void Post(ProductModel data)
{
...
}
我知道它一定是愚蠢的(消耗你一整天的時間)
Chrome 經常會在發布帖子之前嘗試進行OPTIONS
調用。 這樣做是為了確保 CORS 標頭是有序的。 如果您沒有在 API 控制器中處理OPTIONS
調用,則可能會出現問題。
public void Options() { }
當服務器在 https 上時嘗試連接到 http 時,也會發生此錯誤。
這有點令人困惑,因為我的 get-requests 沒問題,問題只出現在 post-requests 中。
我在 GET 調用中得到 405,問題是我在 GET 服務器端方法Get(int formId)
命名了參數,我需要更改路由,或將其重命名為Get(int id)
。
如果說您的方法需要一個參數而您沒有傳遞它,您也可能會收到 405 錯誤。
這不起作用(405錯誤)
HTML 視圖/Javascript
$.ajax({
url: '/api/News',
//.....
網絡API:
public HttpResponseMessage GetNews(int id)
因此,如果方法簽名與上述類似,那么您必須執行以下操作:
HTML 視圖/Javascript
$.ajax({
url: '/api/News/5',
//.....
我參加這個聚會遲到了,但由於以上內容在大多數情況下都不可行或有效,以下是我最終解決的方法。
在托管站點/服務的服務器上,需要一個功能! HTTP 激活!!!
服務器管理器 > 管理 > 添加角色和功能 > next next next 直到你到達 Features > Under .NET (每個版本) 勾選 HTTP Activation。 另請注意,在 >net > WCF Services 下隱藏了一個。
然后立即生效! 那融化了我的大腦
如果你有這樣的路線
[Route("nuclearreactors/{reactorId}")]
您需要在方法中使用完全相同的參數名稱,例如
public ReactorModel GetReactor(reactorId)
{
...
}
如果您不傳遞完全相同的參數,您可能會收到錯誤“405 method not allowed”,因為路由將與請求不匹配,並且 WebApi 將使用不同的允許 HTTP 方法訪問不同的控制器方法。
這並不能回答你的具體問題,但是當我遇到同樣的問題時,我最終來到這里,我認為更多的人可能會做同樣的事情。
我遇到的問題是我無意中將 Get 方法聲明為static 。 我錯過了整個上午,它沒有引起屬性或類似的警告。
不正確:
public class EchoController : ApiController
{
public static string Get()
{
return string.Empty;
}
}
正確的:
public class EchoController : ApiController
{
public string Get()
{
return string.Empty;
}
}
這是一種解決方案
<handlers accessPolicy="Read, Script"> <remove name="WebDAV" /> </handlers>
並從模塊中刪除 WebDAV
<remove name="WebDAVModule" />
[HttpPost] 不需要!
[Route("")]
public void Post(ProductModel data)
{
...
}
我無法解決這個問題。 只要 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>
在我的情況下,我在項目中有一個與 WebAPI 路由(例如沙箱)同名的物理文件夾,並且只有 POST 請求被 IIS 中的靜態文件處理程序攔截(顯然)。
得到一個誤導性的 405 錯誤而不是更預期的 404,是我花了很長時間進行故障排除的原因。
不容易陷入這種境地,但有可能。 希望它可以幫助某人。
就我而言,我的 POST 處理程序采用以下形式:
[HttpPost("{routeParam}")]
public async Task<ActionResult> PostActuality ([FromRoute] int routeParam, [FromBody] PostData data)
我發現我必須交換參數,也就是說首先是正文數據然后是路由參數,如下所示:
[HttpPost("{routeParam}")]
public async Task<ActionResult> PostActuality ([FromBody] PostData data, [FromRoute] int routeParam)
簽入您的項目 .csproj 文件並更改
<IISUrl>http://localhost:PORT/</IISUrl>
像這樣到您的網站網址
<IISUrl>http://example.com:applicationName/</IISUrl>
導致相同行為的另一個可能問題是路由中的默認參數。 在我的情況下,控制器被正確定位和實例化,但由於指定了默認的Get
操作,POST 被阻止:
config.Routes.MapHttpRoute(
name: "GetAllRoute",
routeTemplate: "api/{controller}.{ext}"/*,
defaults: new { action = "Get" }*/ // this was causing the issue
);
我遇到了完全相同的問題。 我找了兩個小時沒有運氣,直到我意識到我的POST
方法是private
而不是public
。
有趣的是現在看到錯誤消息有點通用。 希望能幫助到你!
我們有一個類似的問題。 我們試圖從:
[RoutePrefix("api/car")]
public class CarController: ApiController{
[HTTPGet]
[Route("")]
public virtual async Task<ActionResult> GetAll(){
}
}
所以我們會.GET("/api/car")
這會拋出一個405 error
。
CarController.cs
文件位於目錄/api/car
因此當我們請求此 api 端點時,IIS 會發回錯誤,因為看起來我們正在嘗試訪問我們不允許訪問的虛擬目錄。
選項 1:更改/重命名控制器所在的目錄
選項 2:將路由前綴更改為與虛擬目錄不匹配的內容。
確保您的控制器繼承自Controller
類。
即使沒有它,東西也能在本地工作,這甚至可能更瘋狂。
老問題,但沒有一個答案對我有用。
本文通過向web.config
添加以下行解決了我的問題:
<system.webServer>
<modules runAllManagedModulesForAllRequests="false">
<remove name="WebDAVModule" />
</modules>
</system.webServer>
函數名稱有時會使 c# 變得復雜。 更改函數的名稱,它將起作用。 像 ProductPut 而不是 PutProduct 或 Put。
public Product ProductPut(Product p)
{
return repository.Add(p);
}
就我而言,405 錯誤僅出現在生產服務器中,而不出現在我的開發機器上。
我發現問題是由於我只是“手動”將本地發布文件夾的內容從本地機器傳輸到在線生產服務器。
因此,對我來說,修復方法是簡單地刪除 prod 服務器上的所有在線文件,然后使用 Visual Studio 上的“發布”選項通過 FTP 從我的本地機器直接發布到 prod 服務器。
我不知道為什么這會改變一些東西,因為在我看來文件是相同的,但是這件事解決了問題,我希望它也能幫助其他人。
Another possible cause can be to do with Session State config in IIS causing a redirect which appends "?AspxAutoDetectCookieSupport=1" to the URL. 在我的情況下,我正在執行 POST,但重定向是由 HttpClient 作為 GET 執行的。
我找到的解決方案是將以下內容添加到我的 web.config 中:
<system.web>
<sessionState cookieless="UseCookies" />
</system.web>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.