我有一个网络服务,它托管在我的机器上。我使用的是Windows 7和IIS 7.5。
问题:当客户端尝试使用网络服务时,会收到HTTP 405错误。
在IIS的日志文件中,我可以看到这是因为拒绝了POST动词。
问题:如何允许这些请求使用POST动词?
我是否需要添加WSDL文件的映射?如果需要,我要如何配置这个映射?我已经检查过,在现有的映射中,我没有找到WSDL扩展名的内容。
还有其他在IIS上设置的事项来允许这些请求吗?
网络服务是使用WCF构建的。
我有一个网络服务,它托管在我的机器上。我使用的是Windows 7和IIS 7.5。
问题:当客户端尝试使用网络服务时,会收到HTTP 405错误。
在IIS的日志文件中,我可以看到这是因为拒绝了POST动词。
问题:如何允许这些请求使用POST动词?
我是否需要添加WSDL文件的映射?如果需要,我要如何配置这个映射?我已经检查过,在现有的映射中,我没有找到WSDL扩展名的内容。
还有其他在IIS上设置的事项来允许这些请求吗?
网络服务是使用WCF构建的。
经过长时间努力,以下是最终帮助我解决问题的方法(通过fiddler测试):
完美,fiddler不再返回405,而是愉快地回应200。
我试过之前列出的方法不能解决问题,但是我通过运行以下命令解决了问题:
"%WINDIR%\Microsoft.Net\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r
这个命令重新注册了 *.svc 的处理程序映射。
前往 IIS 管理器 -> 选择网站 -> 处理程序映射 -> 选择处理程序 -> 右键并选择编辑 -> 请求限制 -> 动词选项卡
更改那里的值。
根据您的扩展名,它可能是不同的处理程序。
如果您遇到此页面,但是正在向具有aspx页面的Web应用程序发送请求而不是服务,则有一件重要的事情需要注意。
如果您向http://localhost/MyApplication
发出Fiddler http post请求,它将抛出状态405。但是,如果您指定http://localhost/MyApplication/Default.aspx
,则它将正确响应(状态码为200)。
希望这可以帮助您。我已经在错误的地方寻找了一个小时,调试处理程序、模块、WebDav设置、HTTP动词等。
啊哈——我终于找到了解决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正在寻找一个处理程序来接受OPTIONS动词的*.aspx。如果您查看默认的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" />
<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" />
<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" />