IIS7.5中针对“ PUT”方法的“ 405方法不允许”


113

我使用WebClienttype将* .cab文件上传到我的服务器。在服务器端,我使用PUT方法为* .cab文件注册了HTTP处理程序,如下所示:

 <add name="ResultHandler" path="*.cab" verb="PUT" type="FileUploadApplication.ResultHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode" />

但是我总是收到“ 405方法不允许”错误。响应说允许的方法如下:

Headers = {Allow: GET, HEAD, OPTIONS, TRACE
Content-Length: 1293
Content-Type: text/html
Date: Fri, 27 May 2011 02:08:18 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET}

即使在我的Web应用程序的IIS请求筛选中明确允许PUT方法,仍会发生相同的错误。

我怀疑这是与IIS相关的问题。我希望有人能为我提供一些启示。

Answers:


214

通常,此错误是由尝试处理此类请求的WebDAV模块引起的。一个简单的解决方案是从system.webServerweb.config文件内部的模块和节的处理程序中将其删除。这里是一个配置示例:

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

2
使用下面的MS文章,我将remove标签添加到了处理程序中,但是它仍然无法正常工作。感谢您的回答,我还需要将其添加到模块部分。非常感激。这是文章:asp.net/web-api/overview/testing-and-debugging/…–
Tod Birdsall

太好了,您节省了我数小时的痛苦调试工作!:)
Kaspars Ozols

简单轻松的修复,谢谢!
MorenajeRD

我已经尝试过了,但是对我不起作用。我仍然收到错误405-不允许使用方法。请注意,我使用的是IIS Express,该错误仅以某种方式出现在PUT上,但适用于GET,POST和DELETE。
Thierry

46

我启用了“失败请求跟踪”,并获得了以下信息:

 <EventData>
  <Data Name="ContextId">{00000000-0000-0000-0F00-0080000000FA}</Data>
  <Data Name="ModuleName">WebDAVModule</Data>
  <Data Name="Notification">16</Data>
  <Data Name="HttpStatus">405</Data>
  <Data Name="HttpReason">Method Not Allowed</Data>
  <Data Name="HttpSubStatus">0</Data>
  <Data Name="ErrorCode">0</Data>
  <Data Name="ConfigExceptionInfo"></Data>
 </EventData>

所以,我从IIS卸载了WebDAVModule,现在一切都很好了〜

IIS跟踪功能非常有用。


1
感谢您的回答 !经过2天的研究,我发现唯一避免“ 405 Method Not Allowed”的有效解决方案是在Application_BeginRequest方法中定义CORS标头,如本答案stackoverflow.com/a/14631068/827168所述。但是您的答案比其他所有答案都要好,因为它可以帮助发现问题,而不是应用一些随机补丁:)
pomeh

@pomeh我始终坚信逻辑完整。:)
smwikipedia 2015年


1
请注意,您还应该进入处理程序映射并从那里删除WebDAV,否则您将收到错误消息Handler "WebDAV" has a bad module "WebDAVModule" in its module list
pipedreambomb

26

托管MVC4 WebApi项目时,WebDAV存在此问题。我通过将以下行添加到web.config来解决此问题:

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

如此处所述:http : //evolutionarydeveloper.blogspot.co.uk/2012/07/method-not-allowed-405-on-iis7-website.html


对于真正需要WebDAV的人的最佳解决方案。是否有人需要WebDAV是一个单独的讨论。
MrBoJangles

24

这里拿来的,对我有用:

1.转到IIS管理器。

2.单击您的应用程序。

3.转到“处理程序映射”。

4.在功能列表中,双击“ WebDAV”。

5.单击“请求限制”。

6.在“动词”选项卡中,选择“所有动词”。

7.按确定。


3
这对我有所帮助,但是我将用我的经验进行澄清。2.(Web服务)应用程序。3.双击中央面板中的“处理程序映射”图标。
加里

19

我尝试了大多数答案,但不幸的是,它们都没有完成。

这对我有用。有3件事要做您要PUT的站点(选择站点):

  1. 打开WebDav Authoring Rules,然后选择Disable WebDAV右侧栏上的选项。

  2. 选择Modules,找到WebDAV Module并删除它。

  3. 选择HandlerMapping,找到WebDAVHandler并删除它。

重新启动IIS。


这可行!不知道是否可以通过编辑web.config文件来完成所有3个步骤,但这使仅使用IIS管理控制台变得容易。只是请注意,有3个以WebDAV *开头的HandlerMapping条目-我删除了所有3个,生活很美好。
SlimsGhost

1
我尝试卸载WebDav,但无法正常工作。然后,我按照上面的所有三个步骤PUT开始工作。
royyesdev15年

1
可以将步骤2和3应用于虚拟目录,而不会影响网站的其余部分。
Tonatio

1
非常感谢。你救了我。经过7个小时的挫败之后,尝试了所有我能做的答案,最后您的答案打了我。:)
Zeeshan Safdar

1
谢谢,就是这样。
Ahmad Hamdy

17

只需删除WebDAV模块即可。只需更改您的Web.config:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule" />

14

最好只是删除未使用的WebDAV功能。转到程序和功能 => 打开或关闭Windows功能,并在以下位置禁用WebDAV发布

Internet信息服务 => 万维网服务 => 通用HTTP功能

在此处输入图片说明


谢谢 !这完全解决了我的问题!
wmehanna '17

4

出于任何原因,在我的web.config中将WebDAVModule标记为“删除”还不足以解决我的问题。

我发现了另一种确实解决了问题的方法。如果您在同一条船上,请尝试以下操作:

  1. 在IIS管理器中,选择需要支持PUT的应用程序。
  2. 在“功能”视图中,找到“ WebDAV创作规则”。双击它,或从上下文菜单中选择“ 打开要素 ”(右键单击)。
  3. 在“操作”窗格中,找到并单击“ WebDAV设置...”
  4. 在“ WebDAV设置”中,找到“ 请求过滤行为”,然后在下面找到“ 允许动词过滤”。将“ 允许动词过滤”设置为False
  5. 在“操作”窗格中,单击“ 应用”

这样可以防止WebDAV拒绝它不支持的动词,从而使PUT不受干扰地流到RESTful处理程序。


4

我的另一个提示。我使用过PHP + IIS,并且PHP的Handler映射没有PUT动词。

转到IIS管理器->您的站点->处理程序映射-> PHPxx_via_FastCGI->请求限制->动词,然后添加PUT。

而已!


1
这就是php用户需要的答案。
SpeedOfRound

4

选项动词是在PUT和DELETE生效之前需要重新配置的另一个重要模块

<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="OPTIONSVerbHandler" />
<remove name="WebDAV" />
<add name="OPTIONSVerbHandler" path="*" verb="*" modules="ProtocolSupportModule" resourceType="Unspecified" requireAccess="Script" />
</handlers>

另请参阅此帖子:https : //stackoverflow.com/a/22018750/9376681



2

对我来说,这个错误不会消失并允许使用PUT方法,无论我做了什么..卸载了webdav,将配置放在web.config中以从处理程序和模块中删除webdav,并在iis的请求过滤器上将PUT设置为允许的动词..并确保处理请求的iis处理程序映射已配置PUT。

我的问题最终是由于ASP.NET 4.5扩展的安装错误。从服务器角色和功能中删除了与asp.net相关的所有内容。重新启动。重新读取角色并重新启动。一切都与上面的配置。

---以下内容将使PUT被接受,但会将其发送给错误的处理程序。-忽略以下内容

最后,在iis上的TRACE处理程序映射上将PUT动词作为允许动词添加是可行的..因为我启用了错误跟踪失败,并且该动词不允许该动词。

上次我在另一台服务器的IIS上遇到相同的问题时,这是由于URL末尾缺少“ /”引起的,因为它使用的是默认处理程序,而未使用默认文档,现在我意识到了。处理程序映射(如果没有其他帮助)。


2

我遇到了这个问题,但是与WebDAV没有任何关系。在我的情况下,客户端正在将POST发送到www.myServer.com/api/chart。该调用应由“ ExtensionlessUrlHanlder-Integrated-4.0”处理,但是,以某种方式在我的服务器目录“ ... \ Server \ api \ chart \”中创建了本地文件结构。这意味着将改为调用“ StaticFile”处理程序。删除这些本地文件最终解决了该问题。


2

这对我有用:

打开IIS,然后单击您的站点。

1 - Double Click on the Modules 2 - Right Click on WebDavPublishing and remove. 3 - Restart running WebSite.


2

我使用的是Angular 8,并且是.NET核心API。我将以下内容添加到我的服务web.config文件中。那解决了我的错误。

<system.webServer>
  <modules runAllManagedModulesForAllRequests="false">
    <remove name="WebDAVModule" />
  </modules>
</system.webServer>

1

对于Windows Server 2012->转到服务器管理器->删除角色和功能->服务器角色-> Web服务器(IIS)-> Web服务器->通用HTTP功能->取消选中WebDAV发布并将其删除->重新启动服务器。


0

如果IIS应用程序池在经典模式下运行,请确保web.config中包含以下内容

<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />

    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />

0

就我而言,我已将Web Deploy重定位到了另一个端口,该端口也是IIS端口(不是80)。我一开始没有意识到,但是即使在同一个端口下都没有错误运行,似乎Web Deploy由于某种原因很可能会首先响应而不是IIS,从而导致此错误。我只是将IIS绑定移动到另一个端口,一切都很好。;)


0

要完全禁止启用WebDav,请从ApplicationHost.config中删除以下条目: <add name="WebDAVModule" />

该条目位于模块部分。

配置的确切位置: C:\Windows\System32\inetsrv\config\applicationHost.config


0

我在aspnet核心上运行RESTful API时遇到了同样的问题。

我不想卸载WebDAV,因此尝试了上述大多数补救措施。我试图在网站和服务器本身上都设置动词=“ *”,但没有成功。

对我来说,诀窍是:

IIS管理器->站点-> MySite-> HandlerMappings-> aspNetCore->编辑

->请求限制->访问->无(它是脚本)。

此后,即使我替换了原始的WebDAV选项,一切都可以正常工作。

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.