Asp.NET Web API - 405 - 不允许用于访问此页面的HTTP动词 - 如何设置处理程序映射

时间:2012-03-24 19:01:52

标签: asp.net asp.net-mvc iis iis-7 asp.net-web-api

我使用ASP.NET Web API编写了REST服务。 我正在尝试发送HttpDelete请求,但是我收到以下错误:

  

405 - 不允许使用用于访问此页面的HTTP动词

我认为我接近解决方案,我发现我应该启用IIS远程管理,转到Handler Mappings部分并将DELETE动词添加到适当的位置...... 但问题是名单上有很多不同的立场...... (像这里:http://www.somacon.com/p126.php)。

我应该编辑哪一个? 他们中很少有人没有延期,例如“ExtensionUrlHandler-Integrated-4.0”我添加了DELETE动词,但它仍然不起作用......

在黑暗中修改那个只是一个镜头,所以我应该修改不同的位置吗?如果是这样,哪一个?或者还有什么我应该做的?

同样的网络服务在我的本地服务上运行得非常好,所以我猜问题是远程IIS ...

问候

13 个答案:

答案 0 :(得分:314)

您无需卸载WebDAV,只需将这些行添加到web.config:

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

答案 1 :(得分:25)

此错误的常见原因是WebDAV。确保卸载它。

答案 2 :(得分:16)

更改您的Web.Config文件,如下所示

 <system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

答案 3 :(得分:14)

更改您的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>

答案 4 :(得分:4)

如果以上解决方案都没有像我的情况那样解决您的问题(仍然坚持我的RestClient模块面向405)尝试使用Postman或Fiddler等工具请求您的Api。我的意思是问题可能在其他地方就像一个糟糕的格式化请求

我发现我的RestClient模块正在询问“Put&#39; Id传感器格式不正确:

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

而不是

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

错误地,格式错误的请求返回405 - Method Not Allowed(IIS 7.5)

答案 5 :(得分:3)

不常见但可能有所帮助。

  

确保您使用来自 System.Web.Http [HttpPut]

我们在HttpPut装饰方法上获得了“不允许的方法”405。

我们的问题似乎并不常见,因为我们不小心使用了System.Web.Mvc中的 [HttpPut] 属性而不是System.Web.Http

原因是,resharper建议使用.Mvc版本,因为当您直接从 ApiController 派生时,通常会引用System.Web.Http,我们正在使用扩展ApiController的类。

答案 6 :(得分:2)

当我调用的web api post方法有参数的原始类型而不是从正文访问的复杂类型时,我发生了这种情况(405方法不允许)。像这样:

这有效:

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

这没有:

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

答案 7 :(得分:2)

此错误来自静态文件处理程序 - 默认情况下不会过滤任何动词,但可能只处理HEAD和GET。

这是因为没有其他处理程序进入盘子并表示他们可以处理DELETE。

由于您使用的是WEBAPI,由于路由没有文件,因此没有扩展名,因此需要在web.config文件中添加以下内容:

<system.webserver>
    <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="C:\windows\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="C:\windows\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" />

显然需要什么取决于classicmode vs integratedmode,而classicmode取决于bitness。此外,为CORS处理添加了OPTIONS标头,但如果你不做CORS则不需要它。

仅供参考,您的web.config是应用程序(或应用程序目录)版本的本地版本,其顶级是applicationHost.config。

答案 8 :(得分:2)

检查您的 web.confiq 文件”

<modules>        
        <remove name="WebDAVModule" />    
    </modules> 
      <handlers>
                <remove name="WebDAV" />
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>

答案 9 :(得分:1)

如果是IIS 8.0,请检查是否启用了HTTP激活。 服务器管理器 - &gt; IIS - &gt;管理(见右上) - &gt;添加角色和功能 - &gt; ... - &gt;进入WCF配置,然后选择HTTP Activation。

答案 10 :(得分:0)

在我们的案例中,问题出在.Net站点和ADFS之间的联合登录。重定向到ADFS端点时,wctx参数需要所有三个参数 WSFederationAuthenticationModule.CreateSignInRequest方法:rmidru

感谢Guillaume Raymond提示检查网址参数!

答案 11 :(得分:0)

除上述所有解决方案外,请检查您是否拥有“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
}

注意:另外,请确保通过网址而不是将数据传递给将有效负载作为正文内容的数据方法。

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

示例:

DELETE http://localhost/item/1

希望它有所帮助。

答案 12 :(得分:0)

以上都不对我有用,我在使用支持页面进行射击时遇到麻烦https://support.microsoft.com/en-us/help/942051/error-message-when-a-user-visits-a-website-that-is-hosted-on-a-server)then,我将应用程序主机文件与一个工作副本进行了比较,似乎我缺少了许多处理程序,当我将它们重新添加到应用程序主机中,即可开始工作。 我错过了所有这些,

<add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />