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

问题描述 投票:89回答:13

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

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

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

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

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

相同的Web服务在我的本地服务上工作得很好,所以我猜问题是远程IIS ...

问候

asp.net asp.net-mvc iis iis-7 asp.net-web-api
13个回答
25
投票

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


1
投票

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


0
投票

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

感谢Guillaume Raymond提示检查URL参数!


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
}

注意:还要确保通过url传递数据,而不是将有效负载作为正文内容传递的数据方法。

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

例:

DELETE http://localhost/item/1

希望能帮助到你。


0
投票

我将添加那些卡住试图运行PHP(可能情况下的Laravel)或其他独特的IIS托管情况与405 error,你需要更改处理程序中的verbs为那个特定的情况......所以,因为我使用PHP我去了PHP处理程序和Request Restrictions,然后Verbs选项卡,添加你需要的verbs。这就是我需要添加到web.config以在CORS中启用Laravel

<handlers>
  <remove name="php-5.6.40" />
  <add name="php-5.6.40" path="*.php" verb="GET,HEAD,POST,PUT,DELETE,OPTIONS" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.6\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>

320
投票

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

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

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>

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
投票

如果以上解决方案都没有像我的情况那样解决你的问题(仍然坚持我的RestClient模块面向405)尝试使用像Postman或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)


3
投票

不常见但可能有所帮助。

确保您使用System.Web.Http中的[HttpPut]

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

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

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


3
投票

我有这个问题,我解决了以下问题:

  1. 打开IIS
  2. 选择后端站点 enter image description here
  3. 在功能视图中:打开处理程序映射

enter image description here

  1. 在“处理程序映射”窗口中,查找WebDAV

enter image description here

  1. 在“编辑模块映射”中,打开“请求限制”

enter image description here

  1. enter image description here

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)

2
投票

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

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

由于您使用的是WEB API,由于路由没有文件,因此没有扩展名,因此需要在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和integratedmode,而classicmode取决于bitness。此外,OPTIONS标头已添加用于CORS处理,但如果您不执行CORS,则不需要它。

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

© www.soinside.com 2019 - 2024. All rights reserved.