【问题标题】:HTTP Error 405.0 - Method Not Allowed in IIS ExpressHTTP 错误 405.0 - IIS Express 中不允许的方法
【发布时间】:2022-02-09 19:46:08
【问题描述】:

在 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。如果我再试一次 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 在默认情况下被破坏。它们不处理动词,而不是像 Web 服务器那样处理 HTTP 动词。

在管理 Windows Server 上运行的完整 IIS 时,最容易看到这一点。选择任何内置处理程序(例如 cshtml 处理程序),您会看到有人认为如果它仅与 GETHEADPOST 一起使用会很搞笑,和DEBUG动词:

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

问题变成了:

  • 为什么确实不起作用
  • 究竟如何修复它
  • 如何在 IIS Express 中修复它(无需任何管理工具)
  • 为什么它继续运送,年复一年,坏了

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

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

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

剩下的唯一处理程序设置为允许 any 动词。然而,如果我们向 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 是什么,它怎么可能是一个问题,为什么它是一个问题,或者如果它只会导致问题,它为什么存在。 WebDAV 可以作为处理程序从 IIS 管理用户界面中删除:

这与从web.config 中的handlers 部分添加remove 条目相同(用户界面本身会为您将条目添加到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 的迷你 Web 服务器。它使用 IIS Express 本身的便携式安装(即不需要安装 IIS Express Windows 功能)。

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

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

已经 15 年多了,而且这种情况仍在继续。 IIS 不能用作 Web 服务器一定有一个的原因。但它是什么?我找不到任何知识库文章或博客文章来解释 IIS 团队为何拒绝正常运行。

阅读奖励

研究工作

【问题讨论】:

    标签: iis visual-studio-2013 iis-7 iis-7.5 iis-express


    【解决方案1】:

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

    无论如何,根据问题中的这条评论:

    这完全是为了尝试使用 HTTP 动词:

    以及涉及通用处理程序的相应示例,我将尝试展示使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>
    

    根据您最初设置网站/应用程序的方式,您的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>
    

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

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

    My Documents\IISExpress\config
    

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

    如果您想拥有自己的允许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"/>
    

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

    【讨论】:

    • 天哪!我整天都在搜索,每个答案都是“删除 WebDAV”或修改“applicationHost.config”文件。这些都不适合我。我们使用安装了 UrlRewrite 2.0 的 ASP.NET WebForms 框架来处理友好的 url。这是我找到的最优雅的解决方案。太棒了!
    • 5 年后,这仍然是个问题!知道如何为 .NET Core 3.1 和 Visual Studio 2019 解决此问题。当我在此处尝试解决方案时,如果我在 web.config 文件中有处理程序部分,我的本地网站将不再启动。
    • @AntWaters .Net Core 是一个不同的野兽。这个答案可能对你没有用。建议您发布一个新问题,详细描述您的情况。我敢肯定,有人将能够引导您朝着正确的方向前进……
    • 谢谢。我在以下方面找到了一些指示,但那里的解决方案都不适合我:stackoverflow.com/questions/48188895/…
    【解决方案2】:

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

    我专门尝试使用 IISnode 模块设置 MEAN 堆栈。当访问 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 网络服务器

    -- 然而--

    我还没有尝试过,但也许您可能想考虑修改位于此处的名为 ApplicationHost.config 的 IIS 系统配置文件本身:

    C:\Windows\System32\inetsrv\config

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

    让我知道它是怎么回事,我可能会在以后有时间的时候尝试这样做

    【讨论】:

    • 这也正是我的问题,通过在节点应用程序的 web.config 中添加处理程序以删除 webdav,如原始帖子所述,PUT 和 DELETE 再次开始工作。
    • 这非常有用,它正在工作。我尝试了一些解决方案,但我认为这是最好的
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      该死的,这两天研究了很多......

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

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

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

      我所做的只是修改 PHP 处理程序 [MODIFY: 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>
      

      【讨论】:

      • 我们不得不删除一些东西然后正确地重新添加它是非常令人沮丧的。我们真的希望微软能开箱即用地做正确的事情。
      猜你喜欢
      • 1970-01-01
      • 2012-06-29
      • 2015-06-13
      • 2013-07-13
      • 2016-03-05
      • 2012-08-26
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多