IIS 7.5,Web服务和HTTP 405错误

时间:2010-11-26 17:16:10

标签: c# wcf iis http-post

我有一个我在我的机器上托管的网络服务。我使用的是Windows 7和IIS 7.5。

问题:当客户端尝试使用Web服务时,他/她会收到HTTP 405错误。

在IIS的日志文件中,我可以看到这被拒绝,因为不允许POST动词。

问题:如何为这些请求允许POST动词?
我是否必须添加WSDL文件的映射?如果我这样做,我该如何配置此映射?我检查过,在现有的映射中,我没有WSDL扩展。

在IIS上设置是否还有其他东西可以允许这些请求?

使用 WCF 构建Web服务。

6 个答案:

答案 0 :(得分:14)

经过几个小时的挣扎,这是帮助我的最终解决方案(从小提琴手测试):

  1. 在IIS 7.5上 - >您的网站 - >处理程序映射
  2. 选择面板右侧的“添加模块映射”选项
  3. 在“请求路径”字段中输入* .wsdl
  4. 在“模块”字段中输入“ProtocolSupportModule”
  5. 点击“请求限制”并转到“动词”标签
  6. 输入POST动词
  7. 保存更改
  8. 结束瞧,小提琴手不再回答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处理程序在没有'自定义标题'部分解决方案的情况下工作,我是对这些解决方案持开放态度。

相关问题