HTTP错误405.0 - 方法不被允许在IIS Express中。

20
在使用Visual Studio 2013向本地IIS Express网站发布一个完美的动词时:
CROMULENT http://localhost:7579/Handler.ashx HTTP/1.1
Host: localhost:7579

服务器响应错误:
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS, TRACE

这是对一个“通用处理程序”(即.ashx)的请求。如果我再试一次对静态资源的请求:
SCHWIFTY http://localhost:7579/Default.htm HTTP/1.1
Host: localhost:7579

服务器响应错误:
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS, TRACE

这是所有尝试使用HTTP动词的方式:

DELETE http://localhost:7579/Handler.ashx HTTP/1.1
Host: localhost:7579

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS, TRACE

PUThttp://localhost:7579/Handler.ashx HTTP/1.1
Host: localhost:7579

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS, TRACE

这个问题已经被问到死了,有时甚至是我在问。但是没有人提出解决方案。

</Question>

微软的Bug

问题根本上在于,微软默认情况下发货的IIS和IISExpress是有问题的。它们不处理HTTP动词,而Web服务器需要处理这些动词。

当管理运行在Windows Server上的完整的IIS时,可以最容易地看到这一点。选择任何内置处理程序(例如cshtml处理程序),您会发现有人认为只使用GET、HEAD、POST和DEBUG动词才能正常工作,这可能是“滑稽可笑”的。

enter image description here

与其在HTTP服务器中正确实现HTTP支持,不如在HTTP服务器中实现静态文件处理程序。

问题是:

  • 为什么确切地它不起作用?
  • 如何确切地修复它?
  • 如何在IIS Express中修复它(不使用任何管理工具)?
  • 为什么它在年复一年后仍然损坏并继续发货?

问题1.为什么不起作用?

第一个问题是为什么不起作用。让我们看一个IIS服务器,我们已经删除了除基本的静态文件处理程序之外的所有处理程序:

enter image description here

处理程序配置为所有动词:

所有动词都可以使用该处理程序:

enter image description here

唯一剩下的处理程序设置为允许任何动词。然而,如果我们向Web服务器发出请求,则会收到错误提示:
DELETE http://scratch.avatopia.com/ HTTP/1.1
Host: scratch.avatopia.com

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS, TRACE
Server: Microsoft-IIS/7.5

为什么会发生这种情况?为什么它不起作用?哪个配置选项可以实现以下功能: - GET - HEAD - OPTIONS - TRACE
因为服务器本身声称只支持这些动词。但是,如果我们将其更改为GET,则可以正常工作。
GET http://scratch.avatopia.com/ HTTP/1.1
User-Agent: Fiddler
Host: scratch.avatopia.com

HTTP/1.1 200 OK
Content-Type: text/html

问题2. 如何解决?

通常的做法是删除WebDAV。没有人知道WebDAV是什么,它为什么会成为问题,为什么存在如果只会导致问题。可以从IIS管理用户界面中将WebDAV作为处理程序移除:

enter image description here

这与在web.config的handlers部分添加一个“remove”条目相同(UI会为您添加该条目):
<system.webServer>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>

除了这个方法不起作用。那么我们该如何修复它呢?

从IIS开始,似乎WebDAV变得更像病毒了。与其仅将其禁用为处理程序,您必须完全安装或卸载它作为模块

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

听起来是个不错的想法,但在我的测试案例中,在IIS 7.5上,WebDAV既未安装,也已作为模块删除:

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS, TRACE
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Tue, 10 May 2016 19:19:42 GMT
Content-Length: 0

因此,如果我们能够找出如何解决这个问题,我们就可以回答第二个问题。

问题3. 如何在IIS Express中修复它

从Visual Studio 2013开始1,Visual Studio不再使用一个叫做Cassini的小型Web服务器。它使用了一个便携式的IIS Express安装(即不需要安装IIS Express Windows特性)。

大部分上述的修复尝试在IIS中失败了。但是没有人在Visual Studio 2013的IIS Express中处理它们(这就是为什么这个问题与其他问题不同的原因)。

问题4. 为什么这种情况一直发生?

已经过去15年了,这种情况仍然在发生。肯定有一个很好的理由,为什么IIS不能作为一个Web服务器运行。但是是什么呢?我还没有找到任何知识库文章或博客文章来解释为什么IIS团队拒绝正确地运行。

额外阅读

研究工作

5个回答

6
我在问题中捕捉到一些沮丧情绪,因此“实际”问题不太清楚。你具体是想做什么但失败了?你期望得到什么样的答案?
无论如何,基于问题中的这个评论:
这一切都是为了尝试使用HTTP动词:
和涉及通用处理程序的相应示例,我将尝试展示使通用处理程序能够PUT和DELETE所需的内容。
为了在通用处理程序上允许PUT和DELETE,必须在应用程序的web.config中允许它。为此,您应该按以下方式注册*.ashx的处理程序:
<system.webServer>
    <handlers>
        <add name="SimpleHandlerFactory-Integrated-WithPutDelete"
            path="*.ashx"
            verb="GET,HEAD,POST,DEBUG,PUT,DELETE"
            type="System.Web.UI.SimpleHandlerFactory"
            resourceType="Unspecified"
            requireAccess="Script"
            preCondition="integratedMode" />
    </handlers>
</system.webServer>

根据您最初设置网站/应用程序的方式,您的web.config文件中可能已经注册了"type=System.Web.UI.SimpleHandlerFactory"的处理程序,也可能没有。如果有一个处理程序,您只需修改该条目并添加您想要允许的动词即可。
请注意,此条目具有"preCondition=integratedMode"。我相信,在使用IIS Express调试Visual Studio时,这应该可以工作。在实际的IIS部署中,处理程序注册可能需要修改以匹配将运行应用程序的应用程序池。对于在经典模式下运行的应用程序(而不是集成模式),它可能看起来像这样(未经测试,可能不正确):
<system.webServer>
    <handlers>
        <add name="SimpleHandlerFactory-ISAPI-4.0_64bit-WithPutDelete" 
            path="*.ashx" 
            verb="GET,HEAD,POST,DEBUG,PUT,DELETE" 
            modules="IsapiModule" 
            scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" 
            preCondition="classicMode,runtimeVersionv4.0,bitness64" 
            responseBufferLimit="0" />
    </handlers>
</system.webServer>

具体细节取决于应用程序池的框架版本和位数。

如果你在使用IIS Express时在Visual Studio中进行调试,你应该查看设置了许多关于IIS Express默认值的applicationhost.config。它位于:

My Documents\IISExpress\config

在经典管道应用程序池中进行的未经测试的处理程序注册是该文件中处理程序注册的轻微修改。在我的环境中,该文件中有6个不同的*.ashx条目,具有不同的先决条件。
如果您想要自己的注册并允许PUTDELETE,最好明确删除web.config中的所有这些内容。它们并非都会同时激活/注册,因为先决条件(我想)互斥,但对我来说,仅需一个接一个地将它们全部删除即可。在我的环境中,删除部分如下:
<remove name="SimpleHandlerFactory-ISAPI-4.0_64bit"/>
<remove name="SimpleHandlerFactory-ISAPI-4.0_32bit"/>
<remove name="SimpleHandlerFactory-Integrated-4.0"/>
<remove name="SimpleHandlerFactory-Integrated"/>
<remove name="SimpleHandlerFactory-ISAPI-2.0"/>
<remove name="SimpleHandlerFactory-ISAPI-2.0-64"/>

希望这能在一定程度上为你解答一些疑惑。

1
哇塞!我搜索了一整天,每个答案都是“删除WebDAV”或修改“applicationHost.config”文件。但这些方法对我都不起作用。我们使用的是ASP.NET WebForms框架,安装了UrlRewrite 2.0来处理友好的URL链接。这无疑是我找到的最优雅的解决方案。太棒了! - Jason
五年过去了,这仍然是一个问题!有没有想法如何在.NET Core 3.1和Visual Studio 2019中修复它。当我尝试这里的解决方案时,如果我在web.config文件中有一个Handlers部分,我的本地网站将不再启动。 - Ant Waters
@AntWaters .Net Core是一种不同的东西。这个答案可能对你没有用。建议你发布一个新问题,详细描述你的情况。我相信有人会指导你朝着正确的方向前进... - user1429080
谢谢。我已经找到了一些关于以下问题的指针,但是那里的解决方案都还不适用于我: https://dev59.com/CVYM5IYBdhLWcg3w7jg1 - Ant Waters

5

好的,我在尝试使用IIS 7.5时遇到了同样的问题,当尝试使用PUT或DELETE时返回了错误码405。

我正在尝试配置MEAN堆栈和IISnode模块。当访问IIS提供的静态HTML文件时,我可以进行GET和PUSH操作,但无法进行PUT或DELETE操作。

-- 问题所在 --

我认为问题出在IIS服务器本身上。请查看这篇文章:

https://blogs.msdn.microsoft.com/saurabh_singh/2010/12/10/anonymous-put-in-webdav-on-iis-7-deprecated/

https://support.microsoft.com/en-us/kb/2021641

看起来IIS不再允许匿名PUT或DELETE。

因此,最终我选择了一个nodejs web服务器。

-- 然而 --

我没有尝试过,但也许您可以考虑修改IIS系统配置文件ApplicationHost.config,该文件位于以下位置:

C:\Windows\System32\inetsrv\config

请确保使用管理员权限打开notepad。

让我知道进展情况,如果有时间我也可以尝试。


这正是我的问题,通过在节点应用程序的web.config中添加处理程序以删除WebDAV,就像原始帖子中所述,PUT和DELETE再次开始工作。 - BelgoCanadian
这非常有用,它能够正常工作。我尝试了一些解决方案,但我认为这是最好的。 - May'Habit

1

1

天啊,这两天进行了很多研究....

没有安装WebDav,也没有典型的处理程序修改(SimpleHandlerFactoryExtensionlessUrl

对于那些使用任何PHP框架的人,如:Laravel,CakePHP等

我无法使IIS失败跟踪日志工作,所以...

我所做的就是修改PHP处理程序[修改:php-X_VERSION]:

<handlers>
    <remove name="php-X_VERSION" />
    <add name="php-X_VERSION" path="*.php" verb="GET,HEAD,POST,PUT,DELETE" modules="FastCgiModule" scriptProcessor="D:\Program Files\PHP\X_VERSION\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>

1
很令人沮丧的是,我们必须先删除某些东西,然后再正确地重新添加它。我们真的希望微软能够在一开始就正确地做好这些事情。 - Ian Boyd

0

我没有安装WebDAV,并且正在从VS2019运行IIS Express。经过一些挖掘,我找到了IIS Express使用的applicationhost.config文件,并通过更改我的项目web.config文件得出了解决方案。在system.webServer/handlers部分中,添加以下内容:

    <system.webServer>
    <handlers>
        <remove name="PageHandlerFactory-ISAPI-4.0_64bit"/>
        <remove name="PageHandlerFactory-ISAPI-4.0_32bit"/>
        <remove name="PageHandlerFactory-Integrated-4.0"/>
        <remove name="PageHandlerFactory-Integrated"/>
        <remove name="PageHandlerFactory-ISAPI-2.0"/>
        <remove name="PageHandlerFactory-ISAPI-2.0-64"/>
        <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG,PUT" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
        <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG,PUT" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
        <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG,PUT" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
        <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG,PUT" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv2.0" />
        <add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG,PUT" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
        <add name="PageHandlerFactory-ISAPI-2.0-64" path="*.aspx" verb="GET,HEAD,POST,DEBUG,PUT" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
    </handlers>
</system.webServer>
    

所有这个做的事情,就是将单词“PUT”添加到每个处理程序的动词属性中。 我还必须补充一点,我正在处理一个旧项目,并使用*.aspx文件创建API端点,这就是为什么在谷歌搜索中找到的其他解决方案不起作用的原因。所以,如果您正在使用VS2019并且出现错误405.0-方法不允许,并且您已经删除了WebDAV并使用.aspx文件公开您的API,则可能会起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接