asp.net - not - iis post 405




Asp.NET Web API-405-用於訪問此頁面的HTTP謂詞不被允許-如何設置處理程序映射 (8)

我使用ASP.NET Web API編寫了REST服務。 我試圖發送HttpDelete請求,但是我得到以下錯誤:

405 - 用於訪問此頁面的HTTP動詞不被允許

我認為我接近解決方案,我發現我應該啟用IIS遠程管理,轉到Handler Mappings部分,並將DELETE動詞添加到適當的位置......但問題在於,存在很多不同的位置名單...(像這裡: http://www.somacon.com/p126.php : http://www.somacon.com/p126.php )。

我應該編輯哪一個? 其中幾乎沒有擴展名,例如“ExtensionUrlHandler-Integrated-4.0”,我添加了DELETE動詞,但它仍然不起作用...

這只是在黑暗中修改一個鏡頭,所以我應該修改不同的位置? 如果是這樣,哪一個? 或者還有什麼我應該做的更多?

相同的Web服務在我的本地服務上工作得非常好,所以我想問題是遠程IIS ...

問候


不常見但可能有所幫助。

確保你使用System.Web.Http的 [HttpPut]

我們通過HttpPut裝飾方法得到'方法不允許'405。

我們的問題似乎並不常見,因為我們意外地使用了System.Web.Mvc中的[HttpPut]屬性而不是System.Web.Http

原因是,resharper建議使用.Mvc版本,因為通常當你從ApiController直接派生System.Web.Http時,我們使用的是擴展ApiController的類。


在我們的例子中,問題是在.Net站點和ADFS之間進行聯合登錄。 重定向到ADFS端點時, wctx參數需要WSFederationAuthenticationModule.CreateSignInRequest方法的所有三個參數: rmidru

感謝Guillaume Raymond提示檢查URL參數!


如下所示更改您的Web.Config文件。 它會表現得像魅力。

在節點<system.webServer>添加以下部分代碼

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

添加後,您的Web.Config將如下所示

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/>
    </modules>
    <httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
    </httpProtocol>
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

如果上述解決方案都不能解決您的問題(仍然停留在面對405的RestClient模塊中),請嘗試使用Fiddler這樣的工具來請求您的Api。 我的意思是這個問題可能在其他地方像一個不好格式化的請求。

我發現我的RestClient模塊要求使用Id格式的'Put'格式不正確:

http://myserver/api/someresource?id=75fd954d-d984-4a31-82fc-8132e1644f78

代替

http://myserver/api/someresource/75fd954d-d984-4a31-82fc-8132e1644f78

令人費解的是,格式錯誤的請求返回405 - 方法不允許(IIS 7.5)


您不需要卸載WebDAV,只需將這些行添加到web.config即可:

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>

我曾經發生過這種情況(405方法不允許),當我調用的web api post方法具有參數的原始類型時,而不是從主體訪問的複雜類型。 像這樣:

這工作:

 [Route("update"), Authorize, HttpPost]
  public int Update([FromBody] updateObject update)

這並沒有:

 [Route("update"), Authorize, HttpPost]
 public int Update(string whatever, int whatever, string whatever)

此錯誤的常見原因是WebDAV 。 確保你卸載它。


除了以上所有解決方案之外,請檢查您是否具有“ id ”或DELETE方法中的任何自定義參數與路由配置匹配。

public void Delete(int id)
{
    //some code here
}

如果您重複出現405錯誤,請按照上述方法將方法簽名重置為默認值並嘗試。

默認情況下,路由配置會在URL中查找id 。 因此,參數名稱id在這裡很重要,除非您更改App_Start文件夾下的路由配置。

你可以改變id的數據類型。

例如,下面的方法應該工作得很好:

public void Delete(string id)
{
    //some code here
}

注意:另外請確保您通過url傳遞數據,而不是將數據方法作為主體內容傳送有效內容。

DELETE http://{url}/{action}/{id}

例:

DELETE http://localhost/item/1

希望能幫助到你。





asp.net-web-api