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

Ian*_*oyd 13 iis iis-7 iis-7.5 iis-express visual-studio-2013

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

CROMULENT http://localhost:7579/Handler.ashx HTTP/1.1
Host: localhost:7579
Run Code Online (Sandbox Code Playgroud)

服务器响应错误:

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS, TRACE
Run Code Online (Sandbox Code Playgroud)

这是对"通用处理程序" (即.ashx)的请求.如果我再次尝试静态资源:

SCHWIFTY http://localhost:7579/Default.htm HTTP/1.1
Host: localhost:7579
Run Code Online (Sandbox Code Playgroud)

服务器响应错误:

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS, TRACE
Run Code Online (Sandbox Code Playgroud)

这是尝试使用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
Run Code Online (Sandbox Code Playgroud)

这个问题有时被我要求死亡.但没有人提出过解决方案.

</问题>

微软的Bug

从根本上说,问题在于Microsoft默认情况下会破坏IIS和IISExpress.他们不需要像处理Web服务器那样处理HTTP谓词,而是处理动词.

在管理在Windows Server上运行的完整IIS时,最容易看到这一点.挑选任何内置的处理程序(例如CSHTML处理程序)的,你可以看到,有人认为这将是热闹的,如果它只是合作过GET,HEAD,POST,和DEBUG动词:

在此输入图像描述

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

问题变成:

  • 为什么恰好没有它的工作
  • 如何准确地解决它
  • 如何在IIS Express中修复它(没有任何管理工具)
  • 为什么它继续被运输,年复一年,破碎

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

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

在此输入图像描述

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

在此输入图像描述

左边唯一的处理程序设置为允许任何动词.但是,如果我们向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
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

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

  • 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
Run Code Online (Sandbox Code Playgroud)

问题2.如何解决?

常识是删除WebDAV.没有人知道WebDAV是什么,它是如何成为一个问题,为什么它是一个问题,或者如果它只是导致问题,它为什么存在.可以从IIS管理用户界面将WebDAV作为处理程序删除:

在此输入图像描述

remove从该handlers部分添加条目相同web.config(UI本身为您添加了对web.config的条目):

<system.webServer>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

除此之外不起作用.那么我们该如何解决呢?

从IIS开始,似乎WebDAV已经变成了一种病毒.您必须完全安装或删除它作为模块,而不是简单地将其禁用为处理程序:

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

这听起来像是一个理由,除了在我的测试用例中,在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
Run Code Online (Sandbox Code Playgroud)

那么,如果我们能弄清楚如何解决问题,我们可以回答第二个问题.

问题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团队拒绝正常运行.

奖金阅读

研究工作

use*_*080 6

我似乎对这个问题感到有点沮丧,所以实际的问题有点不清楚.具体是你正在尝试但却失败了?您对答案有何看法?

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

这是尝试使用HTTP谓词的所有方法:

以及涉及通用处理程序的相应示例,我将尝试展示使其成为可能的内容PUT以及DELETE通用处理程序.

为了允许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>
Run Code Online (Sandbox Code Playgroud)

根据您最初设置网站/应用程序的方式,可能会或可能不会type="System.Web.UI.SimpleHandlerFactory"在您的web.config文件中注册处理程序.如果有,您应该只能修改该条目并添加您想要允许的动词.

你会注意到这个条目有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>
Run Code Online (Sandbox Code Playgroud)

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

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

My Documents\IISExpress\config
Run Code Online (Sandbox Code Playgroud)

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

这可能是一个好主意,明确地去除所有的这些web.config,如果你想拥有自己的注册,允许PUTDELETE.并非所有这些实际上都是同时活动/注册的,因为前提条件(我认为)是相互排斥的,但至少对我而言,它可以一个接一个地将它们全部删除.在我的环境中,删除部分如下所示:

<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"/>
Run Code Online (Sandbox Code Playgroud)

希望这至少会让一些光线照进黑暗的地方!


Mic*_* P. 5

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

我专门在尝试使用IISnode模块设置MEAN堆栈。当访问静态HTML文件IIS时,我能够进行获取和推送,但不能进行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/zh-CN/kb/2021641

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

所以最后我只使用了一个nodejs网络服务器

-但是-

我还没有尝试过,但是也许您可能想研究一下位于以下位置的IIS系统配置文件本身,称为ApplicationHost.config:

C:\ Windows \ System32 \ inetsrv \ config

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

让我知道如何进行,如果有时间,我可能会尝试稍后再做