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


106

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

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

我认为我已经接近解决方案,我发现我应该启用IIS远程管理,转到“处理程序映射”部分,然后将DELETE动词添加到适当的位置...但是问题在于,该位置有很多不同的位置列表...(如此处:http : //www.somacon.com/p126.php)。

我应该编辑哪一个?他们中很少有人没有扩展名,例如“ ExtensionUrlHandler-Integrated-4.0”,我向其中添加了DELETE动词,但它仍然无法正常工作...

修改它只是黑暗中的一枪,所以我应该修改其他位置吗?如果是这样,哪一个?也许还有什么我应该做的?

相同的Web服务在我的本地服务上运行良好,所以我想问题出在远程IIS上。

问候


3
嘿,巴特。您可以更改web.config的答案吗?这确实比卸载它更好。而且观众很多
Ashkan Sirous

Answers:


28

导致此错误的常见原因是WebDAV。确保您将其卸载。


我已禁用它,但没有帮助
Bart

3
禁用并没有帮助,您必须将其卸载。
John_ 2012年

我可以确认禁用没有帮助。@John_正确,您必须卸载。
Mike L

7
giacomelli在下面的回答应标记为对这个问题正确;这是一个本地解决方案,不需要您卸载WebDav。
约瑟夫·伍德沃德2013年

1
@ B.ClayShannon WebDAV不是独立程序,它是IIS的功能。因此,根据您的操作系统,您必须在Windows功能/角色/角色服务/ ...下找到它们,而他们发现可以对其进行分类的任何其他优点。但是,如果web.config中的更改没有区别,则意味着您仍然遇到另一个问题。
弗雷德里克

358

您无需卸载WebDAV,只需将以下行添加到web.config中:

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

1
这很好。确实需要使用所有这些内容。同时包括“删除名称= ...”行。
克里斯·帕特森

51
恕我直言,这应该是公认的答案,因为它是本地解决方案,而不是全局解决方案。
Marco Mp

3
这只是在明天早上进行大型演示之前为我准备的。你识字救了我一命。
Sonic Soul

27
“您从字面上救了我的命”-突然,我的客户似乎并不那么糟糕。
Brandon Gano 2014年

3
极好的答案。我同意这应该是公认的答案。这比从我们的Web服务器完全卸载WebDAV感觉好多了。
mituw16'8

17

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

添加删除的WebDAV和WebDAVMODULE允许使用PUT和DELETE函数。谢谢。
Gfw

当我在我的api项目webconfig文件中添加以上代码时,它陷入了困境
Baqer Naqvi

15

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

您不应该为允许来源返回*。参见stackoverflow.com/a/12014554
Karlas's

@Karlas,请先发表问题,然后再发表评论和反对票。没有询问“ Allow-Origin”的问题,而是询问了HTTP动词的处理程序。
Santosh Prasad Sah

3
我没有拒绝投票,只是旁注,以防有人复制粘贴解决方案。
卡拉斯

谢谢!runAllManagedModulesForAllRequests =“ true”是我所做的。
Eddie Fletcher '18

8

我遇到了这个问题,并解决了以下问题:

  1. 打开IIS
  2. 选择后端站点

    在此处输入图片说明

  3. 在功能视图中:打开处理程序映射

在此处输入图片说明

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

在此处输入图片说明

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

在此处输入图片说明

  1. 在此处输入图片说明

救了我一命。谢谢
deanwilliammills19年

1
这没有用。它破坏了整个.Net CORE网站。不得不还原。
拉维·拉姆

4

如果上述解决方案都不能解决您的问题(对于我而言仍然如此(面对405的RestClient模块仍然存在)),请尝试使用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)


我在这里也有同样的情况。但是,就我而言,我必须通过PUT请求传递正文。我使用Insomnia(如Postman)作为工具客户端,并且效果很好。但不是我的代码。有任何想法吗?
达罗斯

3

罕见,但可能会有所帮助。

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

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

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

原因是,resharper建议使用.Mvc版本,在该版本中,直接从中派生时通常已经引用了System.Web.Http。 ApiController因为我们使用的是扩展ApiController的类。


1
如果您使用的是Web API,则根本不修饰控制器方法-而是在方法名称中使用动词。
niico

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)

1
如果路由中的参数与方法签名中的变量名称不匹配(也就是route =“ / api / person / {identity}”和method =“ public void putPerson(int id)”),也会发生这种情况{...}“)
RonnBlack 2015年

2

此错误来自staticfile处理程序-默认情况下不会过滤任何动词,但可能只能处理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" />

显然需要什么取决于经典模式与集成模式,而经典模式取决于位。此外,还添加了OPTIONS标头用于CORS处理,但是如果您不执行CORS,则不需要这样做。

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


1

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


0

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

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


0

除上述所有解决方案外,请检查您是否具有“ id”或方法中的任何自定义定义参数DELETE是否与路由配置匹配。

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

如果遇到重复405错误,则最好将方法签名重设为上述默认值,然后尝试。

默认情况下,路由配置将id在URL中查找。因此,id这里的参数名称很重要,除非您更改App_Start文件夹下的route config 。

您可以更改不过的数据类型id

例如,下面的方法应该可以正常工作:

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

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

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

例:

DELETE http://localhost/item/1

希望能帮助到你。


0

我将为那些试图通过运行PHPLaravel在某些情况下)或其他独特的IIS托管情况而陷入困境的人添加一个405 error,您需要verbs针对该特定情况更改处理程序中的处理程序……因此,由于我一直在使用PHP,在PHP处理程序,并在Request Restrictions,那么Verbs标签,添加verbs你所需要的。这是添加到所需的所有我web.config,使CORSLaravel

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

0

以上都不对我有用,我在使用支持页面进行拍摄时遇到麻烦(https://support.microsoft.com/en-us/help/942051/error-message-when-a-user-visits-a-website然后,我将应用程序主机文件与一个工作副本进行了比较,似乎我缺少了一堆处理程序,当我将它们添加回应用程序主机后,它便开始工作。我错过了所有这些,

<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" />
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.