我有一个我在我的机器上托管的网络服务。我使用的是Windows 7和IIS 7.5。
问题:当客户端尝试使用Web服务时,他/她会收到HTTP 405错误。
在IIS的日志文件中,我可以看到这被拒绝,因为不允许POST动词。
问题:如何为这些请求允许POST动词?
我是否必须添加WSDL文件的映射?如果我这样做,我该如何配置此映射?我检查过,在现有的映射中,我没有WSDL扩展。
在IIS上设置是否还有其他东西可以允许这些请求?
使用 WCF 构建Web服务。
答案 0 :(得分:14)
经过几个小时的挣扎,这是帮助我的最终解决方案(从小提琴手测试):
结束瞧,小提琴手不再回答405,而是快乐200。
答案 1 :(得分:7)
列出的答案对我不起作用,但我能够通过运行
来解决问题“%WINDIR%\ Microsoft.Net \ Framework \ v3.0 \ Windows Communication Foundation \ ServiceModelReg.exe”-r
这重新注册了* .svc
的处理程序映射答案 2 :(得分:2)
转到IIS管理器 - >选择网站 - >处理程序映射 - >选择处理程序 - >右键单击并选择编辑 - >请求限制 - >动词标签
更改那里的值。
根据您的扩展程序,它可能是一个不同的处理程序。
答案 3 :(得分:1)
对于碰到这个页面但是正在向使用aspx页面而不是服务的Web应用程序发出请求的人来说,有一件重要的事情需要注意。
如果你向http://localhost/MyApplication
提出了一个小小的http发布请求,它将会抛出状态405。
但是,如果您指定http://localhost/MyApplication/Default.aspx
,它将正确响应(状态为200)
希望这会有所帮助。我一直在寻找错误的地方一小时,调试处理程序,模块,webdav设置,http动词等。
答案 4 :(得分:0)
原来我没有启用WCF HTTP激活。解决方案:WCF on IIS8; *.svc handler mapping doesn't work
答案 5 :(得分:0)
啊 - 我终于在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" />
因此,首先尝试它,并得出结论,这是我需要的,我在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处理程序在没有'自定义标题'部分解决方案的情况下工作,我是对这些解决方案持开放态度。