簡體   English   中英

405 方法不允許 Web API

[英]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>

docs.microsoft.com 解決方案文章

並從模塊中刪除 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM