IIS 7.5、Web 服务和 HTTP 405 错误
Posted
技术标签:
【中文标题】IIS 7.5、Web 服务和 HTTP 405 错误【英文标题】:IIS 7.5, Web Service and HTTP 405 error 【发布时间】:2011-05-16 07:09:51 【问题描述】:我有一个托管在我的机器上的 Web 服务。我使用 Windows 7 和 IIS 7.5。
问题:当客户端尝试使用 Web 服务时,他/她收到 HTTP 405 错误。
在 IIS 的日志文件中,我可以看到这被拒绝,因为不允许 POST 动词。
问题:我怎样才能为这些请求允许 POST 动词? 我必须添加 WSDL 文件的映射吗?如果我这样做了,我该如何配置这个映射?我已经检查过了,在现有的映射中我没有任何 WSDL 扩展。
是否需要在 IIS 上设置其他东西以允许这些请求?
Web 服务是使用 WCF 构建的。
【问题讨论】:
确保您在计算机上安装了 .NET 4.0。确保你看到这个:support.microsoft.com/kb/2015129 【参考方案1】:经过数小时的努力,这是帮助我的最终解决方案(从提琴手测试):
-
在 IIS 7.5 上 -> YourWebsite -> 处理程序映射
选择面板右侧的“添加模块映射”选项
在“请求路径”字段中输入 *.wsdl
在“模块”字段中输入“ProtocolSupportModule”
点击“请求限制”并转到动词选项卡
输入 POST 动词
保存更改
结束瞧,提琴手不再用 405 回答,而是用快乐的 200 回答。
【讨论】:
Buhtla,如果这是为您解决问题的答案,请使用绿色复选标记进行标记。 SO 允许(并鼓励)这样做。 你是怎么知道这个@buhtla的?它对我有用:非常感谢!但我认为发布您从中获取此信息的 URL 也会有所帮助,请标记为答案,因为其他人更容易找到解决方案。 我很高兴帮助了你们!在我遇到这个问题之后过了很长一段时间,但我记得我自己找到了这个解决方案。也许有些页面对所描述的问题具有相同的解决方案,但我不知道它们。 也为我工作,你很棒!【参考方案2】:列出的答案对我不起作用,但我能够通过运行解决问题
"%WINDIR%\Microsoft.Net\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r
这为 *.svc 重新注册了处理程序映射
【讨论】:
【参考方案3】:转到 IIS 管理器 -> 选择网站 -> 处理程序映射 -> 选择处理程序 -> 右键单击并选择编辑 -> 请求限制 -> 动词选项卡
更改那里的值。
根据您的扩展,它可能是不同的处理程序。
【讨论】:
是的,但是对于什么处理程序?我没有特定的 wsdl 扩展处理程序。 对于 Web 服务 (*.asmx) WebServiceFactoryHandler 我正在用 WCF 实现这个,所以这实际上是 .svc 扩展名。我已经检查过了,对于 svc 扩展,所有动词都是允许的。我仍然得到同样的错误...... 另外补充一点,所有 asmx 处理程序都允许 POST。 我终于找到了解决办法。我将其发布为答案。还是谢谢。【参考方案4】:对于遇到此页面但使用 aspx 页面而不是服务向 Web 应用程序发出请求的人,有一件重要的事情需要注意。
如果您向http://localhost/MyApplication
发出 fiddler http post 请求,它将抛出状态 405。
但是如果你指定http://localhost/MyApplication/Default.aspx
,它会正确响应(状态为200)
希望这会有所帮助。我找错地方了一个小时,调试处理程序、模块、webdav 设置、http 动词等。
【讨论】:
【参考方案5】:原来我没有启用 WCF HTTP 激活。解决方法在这里:WCF on IIS8; *.svc handler mapping doesn't work
【讨论】:
【参考方案6】:啊——我终于在 IIS 地狱中找到了我的 CORS 的解决方案。这是我在寻找解决方案时出现的问题之一。
正确答案是 aliostad 的 -- 问题在于,对于一些实现“OPTIONS”动词的解决方案,建议删除该动词到 ProtocolSupportModule 的映射。或者也许有人刚刚清除了不必要的映射等。这没有留下 OPTIONS 的处理程序。
我不是幕后发生的确切情况的专家,但似乎 IIS 确保在 Application_BeginRequest 事件被触发之前很久就有一个潜在的请求处理程序,尽管它们有序列图:
https://msdn.microsoft.com/en-us/library/bb470252.aspx
所以没有执行你的模块就返回了 405 状态。例如,发送到服务器的内容是:
OPTIONS http://www.example.com/path/mypage.aspx
所以 IIS 正在为 *.aspx 寻找一个接受 OPTIONS 动词的处理程序。如果您查看默认的 applicationHost.config 文件,您会看到,例如:
<add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode" />
我刚刚在我的 web.config 中执行了以下操作以使 IIS 停止返回状态 200 noops:
<remove name="OPTIONSVerbHandler" />
所以,首先尝试了它,并得出结论认为这是需要的,我将以下内容添加到我的 web.config:
<remove name="PageHandlerFactory-ISAPI-4.0_32bit" />
<remove name="PageHandlerFactory-ISAPI-4.0_64bit" />
<remove name="PageHandlerFactory-Integrated" />
<remove name="PageHandlerFactory-Integrated-4.0" />
<add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode" />
请注意,替换与 applicationHost.config 中的内容相匹配,除了每行添加了额外的 OPTIONS 动词。
对于那些使用路由(例如 MVC 或 webapi)的人:
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
最后,我不是 IIS 专家——也许有一种更有效的方式来处理 CORS 的 OPTIONS 动词(更具体地说,允许您的 CORS 处理程序在没有“自定义标头”部分解决方案的情况下工作,我是对这些解决方案持开放态度。
【讨论】:
以上是关于IIS 7.5、Web 服务和 HTTP 405 错误的主要内容,如果未能解决你的问题,请参考以下文章
IIS 7.5 405 方法不允许从 StaticFileModule 进行 PUT
Restful WCF IIS 7.5 405 方法不允许间歇
在 IIS 7.5 中托管的 Web Api 中找不到 HTTP 404 页面
IIS7.5上的REST服务的Put操作发生HTTP Error 405.0 - Method Not Allowed 解决方法