IIS 7.5、Web服务和HTTP 405错误

10

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

问题:当客户端尝试使用网络服务时,会收到HTTP 405错误。

在IIS的日志文件中,我可以看到这是因为拒绝了POST动词。

问题:如何允许这些请求使用POST动词?
我是否需要添加WSDL文件的映射?如果需要,我要如何配置这个映射?我已经检查过,在现有的映射中,我没有找到WSDL扩展名的内容。

还有其他在IIS上设置的事项来允许这些请求吗?

网络服务是使用WCF构建的。


请确保在计算机上安装了.NET 4.0。请确保您看到了这个链接:http://support.microsoft.com/kb/2015129 - user2511471
6个回答

14

经过长时间努力,以下是最终帮助我解决问题的方法(通过fiddler测试):

  1. 在IIS 7.5中 -> YourWebsite -> Handler Mappings
  2. 在面板右侧选择“添加模块映射”选项
  3. 在“请求路径”字段中输入*.wsdl
  4. 在“模块”字段中输入“ProtocolSupportModule”
  5. 点击“请求限制”并前往“动词”选项卡
  6. 输入POST动词
  7. 保存更改

完美,fiddler不再返回405,而是愉快地回应200。


Buhtla,如果这个答案解决了你的问题,请使用绿色复选标记将其标记为已解决。在SO上允许(并且鼓励)这样做。 - Peter
你是怎么发现这个@buhtla的?它对我很有用:非常感谢!但我认为,将获取此信息的URL发布出来也会很有帮助,请标记为答案,因为这样其他人就更容易找到解决方案了。 - Fabio Milheiro
我很高兴能帮助到你们!解决这个问题已经过了一段时间,但我记得是自己找到了这个解决方案。也许有一些页面描述了相同的问题解决方法,但我不知道。 - buhtla
也对我有用,你太棒了! - UMAR-MOBITSOLUTIONS
如何将此添加到web.config - user3642342

7

我试过之前列出的方法不能解决问题,但是我通过运行以下命令解决了问题:

"%WINDIR%\Microsoft.Net\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r

这个命令重新注册了 *.svc 的处理程序映射。


2

前往 IIS 管理器 -> 选择网站 -> 处理程序映射 -> 选择处理程序 -> 右键并选择编辑 -> 请求限制 -> 动词选项卡

更改那里的值。

根据您的扩展名,它可能是不同的处理程序。


是的,但是针对什么处理程序?我没有针对wsdl扩展名的特定处理程序。 - buhtla
对于 Web 服务 (*.asmx),使用 WebServiceFactoryHandler。 - Aliostad
我正在使用WCF实现这个功能,因此它实际上是.svc扩展名。我已经检查过,对于svc扩展名,所有动词都是允许的。但我仍然得到相同的错误... - buhtla
另外需要补充的是,所有 asmx 处理程序都允许使用 POST 方法。 - buhtla
我终于找到了解决方案。我把它发布为答案了。无论如何还是谢谢。 - buhtla

1

如果您遇到此页面,但是正在向具有aspx页面的Web应用程序发送请求而不是服务,则有一件重要的事情需要注意。

如果您向http://localhost/MyApplication发出Fiddler http post请求,它将抛出状态405。但是,如果您指定http://localhost/MyApplication/Default.aspx,则它将正确响应(状态码为200)。

希望这可以帮助您。我已经在错误的地方寻找了一个小时,调试处理程序、模块、WebDav设置、HTTP动词等。


0

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处理程序在没有“自定义标头”部分解决方案的情况下工作),我对这些解决方案持开放态度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接