在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
这个问题有时被我要求死亡。但没有人提出过解决方案。
微软的Bug
从根本上说,问题在于Microsoft默认情况下会破坏IIS和IISExpress。他们不需要像处理网络服务器那样处理HTTP动词,而是处理动词。
管理在Windows Server上运行的完整IIS时,最容易看到这一点。选择任何内置处理程序(例如cshtml处理程序),你可以看到有人认为它只是搞笑,如果它只适用于GET
,HEAD
, POST
和DEBUG
动词:
而不是在HTTP服务器中正确实现对HTTP的支持。
问题变成:
第一个问题是为什么它不起作用。让我们看一下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
为什么会这样?
为什么它不起作用?配置选项在哪里说:
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
常识是删除 WebDAV 。没有人知道WebDAV是什么,它是如何成为一个问题,为什么它是一个问题,或者它存在的原因只有它会导致问题。可以从IIS管理用户界面将WebDAV作为处理程序删除:
相同与remove
中的handlers
部分添加web.config
条目(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
因此,如果我们能够弄清楚如何解决问题,我们可以回答第二个问题。
从Visual Studio 2013 1 开始,Visual Studio不再使用名为Cassini的迷你Web服务器。它使用IIS Express本身的便携式安装(即不需要安装IIS Express Windows功能)。
IIS中的大多数上述修复(尝试)(失败)。但是没有人在Visual Studio 2013的IIS Express中处理它们(这个问题与其他问题有所不同)。
它已经超过15年了,而且这种情况仍然存在。必须有一个良好的原因,因为IIS不能用作Web服务器。但它是什么?我找不到任何知识库文章或博客文章,解释了为什么IIS团队拒绝正常运行。
答案 0 :(得分: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>
根据您最初设置网站/应用程序的方式,可能会或可能没有在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>
具体细节取决于框架版本和应用程序池的位置。
如果使用IIS Express在Visual Studio中进行调试,则应该查看applicationhost.config
,它设置了许多有关IIS Express的默认设置。它位于:
My Documents\IISExpress\config
上面针对经典管道应用程序池的未经测试的处理程序注册是对该文件中处理程序注册的轻微修改。在我的环境中有6个单独的*.ashx
条目,在该文件中有不同的前置条件。
如果您想拥有允许web.config
和PUT
的自己的注册,最好在DELETE
中明确删除所有这些内容。并非所有这些实际上都是同时活动/注册的,因为前提条件(我认为)是相互排斥的,但至少对我而言,它可以一个接一个地将它们全部删除。在我的环境中,删除部分如下所示:
<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 :(得分:4)
好吧所以我在IIS 7.5上遇到了同样的问题,在尝试PUT或DELETE时它返回了405.
我特意尝试使用IISnode模块设置MEAN堆栈。当访问IIS提供的静态HTML文件时,我能够获取和推送但不能PUT或DELETE。
- 问题 -
我认为问题出在IIS服务器本身。看看这篇文章:
https://support.microsoft.com/en-us/kb/2021641
似乎IIS不再允许匿名PUT或DELETE
所以最后我只使用了nodejs webserver而不是
- 但是 -
我没有尝试过这个,但也许您可能想要调查位于此处的名为ApplicationHost.config的IIS系统配置文件本身:
C:\ Windows \ System32下\ INETSRV \配置
确保使用具有管理员权限的记事本
让我知道它是怎么回事,我可能会在我有空的时候尝试这样做
答案 2 :(得分:0)
关于删除WebDAV的讨论很多,而且可以解决此问题-但是,如果您想知道WebDAV是什么以及它的用途,请查看此页面:
答案 3 :(得分:0)
该死的,这两天有很多研究......
没有安装 WebDav,没有典型的处理程序修改(SimpleHandlerFactory
,ExtensionlessUrl
)
对于那些使用任何 PHP 框架的人,例如:Laravel、CakePHP 等
我无法使 IIS Failed Tracing Logs 工作,所以...
我所做的只是修改 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>