HTTP 错误 405.0 - IIS Express 中不允许的方法

HTTP Error 405.0 - Method Not Allowed in IIS Express

在 Visual Studio 2013 下向本地 IIS Express 网站发出完美的 cromulent 动词时:

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

服务器响应错误:

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

这是对"generic handler"(即.ashx的请求。如果我再次尝试 static 资源:

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

这个问题已经被问死了,有时被我问死了。但是从来没有人想出解决办法。

微软的漏洞

从根本上说,问题是 Microsoft 出厂时默认情况下损坏了 IIS 和 IISExpress。他们不处理 HTTP 动词,而是要求 Web 服务器处理动词。

在 Windows 服务器上管理完整的 IIS 运行 时最容易看到这一点。选择任何内置处理程序(例如 cshtml 处理程序),您会看到有人认为如果它仅适用于 GET、[=22] 会 hilarious =]、POSTDEBUG 动词:

而不是在 HTTP 服务器中正确实现对 HTTP 的支持。

问题变为:

问题一、为什么不行?

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

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

剩下的唯一处理程序设置为允许任何动词。然而,如果我们向 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

Why is this happening?

为什么不起作用?配置选项在哪里:

因为服务器本身说这些是唯一支持的动词。

然而,如果我们将其更改为 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 作为处理程序:

与在 web.confighandlers 部分添加 remove 条目相同(UI 本身添加为你进入 web.config):

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

除非这不起作用。那么我们如何修复呢?

从 IIS 开始,WebDAV 似乎更像是一种病毒。 you have to completely install or remove it as a module:

而不是简单地将其禁用为处理程序
<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 20131 开始,Visual Studio 不再使用名为 Cassini 的迷你网络服务器。它使用 IIS Express 本身的便携式安装(即不需要安装 IIS Express Windows 功能)。

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

问题 4. 为什么会一直这样?

15 年过去了,这种情况仍在发生。 IIS 不能用作网络服务器一定有 好的 原因。但它是什么?我找不到任何知识库文章或博客 post,解释 IIS 团队拒绝正常运行的原因。

红利阅读

研究工作

我似乎察觉到这个问题有点令人沮丧,所以 实际 问题有点不清楚。您正在尝试但失败的具体是什么?您对答案有何期待?

无论如何,基于问题中的评论:

This is all by way to trying to use HTTP verbs:

以及涉及通用处理程序的相应示例,我将尝试展示使 PUTDELETE 成为通用处理程序所需的条件。

为了在通用处理程序上允许 PUTDELETE,您必须在应用程序的 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>

根据您最初设置网络的方式 site/application,您的 web.config 文件中可能有也可能没有为 type="System.Web.UI.SimpleHandlerFactory" 注册的处理程序。如果有的话,您应该能够修改该条目并添加您想要允许的动词。

您会注意到此条目有 preCondition="integratedMode"。我相信,这应该在 Visual Studio 中使用 IIS Express 进行调试时起作用。在实际的 IIS 部署中,可能需要修改处理程序注册以匹配 运行 应用程序的应用程序池。对于处于经典模式(未集成)的应用程序 运行ning,它看起来像这样(未测试,因此可能是错误的):

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

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

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

My Documents\IISExpress\config

上面针对经典管道应用程序池的未经测试的处理程序注册是对该文件中处理程序注册的轻微修改。在我的环境中,该文件中有 6 个单独的 *.ashx 条目,前提条件各不相同。

如果您想拥有允许 PUTDELETE 的自己的注册,那么在您的 web.config 中明确删除所有这些可能是个好主意。由于先决条件(我想)是相互排斥的,因此并非所有这些实际上都会同时 active/registered ,但至少对我来说,一个接一个地删除它们是有效的。在我的环境中,带有删除的部分如下所示:

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

希望这至少能给黑暗的地方带来一点光明!

好的,所以我 运行 在 IIS 7.5 上尝试 PUT 或 DELETE 时遇到了同样的问题,它返回了 405。

我专门尝试使用 IISnode 模块设置 MEAN 堆栈。当访问 IIS 提供的静态 HTML 文件时,我能够 GET 和 PUSH 但不能 PUT 或 DELETE。

-- 问题--

我认为问题出在 IIS 服务器本身。看看这里 post:

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 网络服务器

-- 然而--

我没有试过这个,但也许你可能想研究修改 IIS 系统配置文件本身,称为 ApplicationHost.config,位于此处:

C:\Windows\System32\inetsrv\config

确保使用具有管理员权限的记事本

让我知道进展如何,我可能会在有空的时候尝试这样做

有很多关于删除 WebDAV 的讨论,这将解决问题 - 但如果您想知道 WebDAV 是什么以及它的用途,请查看此页面:

https://www.cloudwards.net/what-is-webdav/

天哪,这两天研究了很多....

没有安装 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>