选项预检请求未到达IIS托管服务

时间:2013-09-26 10:06:56

标签: wcf iis iis-7 http-status-code-404 cors

我有一个localhost网站和一个IIS(7.5)托管的WCF服务implemented like this,附带了Visual Studio调试器。每当我向我的服务发出CORS请求时,我都会得到以下404响应,以及标准的ASP.Net错误页面:

OPTIONS http://192.168.200.44/api/values HTTP/1.1
Host: 192.168.200.44
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Origin: http://localhost:51946
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Response >>
HTTP/1.1 404 Not Found
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Thu, 26 Sep 2013 09:38:49 GMT
Content-Length: 1245

最初我收到了错误的200条消息,这些消息没有触及我的WCF应用程序的大量断点,因此它正由IIS本身处理。然后我关注了thisthis SO帖子并从网站中删除了OPTIONSVerbHandler,并在IIS管理器UI中添加了“OPTIONS,PUT,POST& DELETE”作为允许的HTTP谓词(而不是web.conf) ),让我进入了我的404消息。我已经查看了WebDav,它被突出显示为一个问题,但我没有禁用/删除它因为我不知道如何但是已经读过它只会影响“PUT& DELETE”操作,因为我的“POST”操作是也失败了。

GET请求按预期工作,因此服务肯定存在/在IIS中工作,只是选项预检未到达我的服务。

TY

3 个答案:

答案 0 :(得分:3)

虽然OP设法找到了一个在特定情况下有效的解决方案,但同样的问题一直困扰着我过去几个小时。 在我的情况下,我知道它不是代码/ web.config问题,因为相同的代码在我的本地IIS上运行得非常好,但在生产版本上没有。

在阅读了大量帖子并尝试了他们建议的所有内容(包括OP的答案)之后,我实际上已经开始查看IIS日志了(应该先做完了!)并找到了这个:

2015-03-09 14:43:39 <IP Addr> GET /Rejected-By-UrlScan ~/Service.svc/H2dbImportTxtFile <Port> - <IP Addr>

这也引导了我:

http://www.pressthered.com/rejected-by-urlscan_404_errors/

最终[AllowVerbs]的部分:

  

\ SYSTEM32 \ INETSRV \ URLScan的\ URLScan.ini中

我只需要添加OPTIONS。

现在OPTIONS请求得以通过,一切正常。

希望能帮助其他一些被疯狂的人。

编辑:

如另一篇SO帖子所述(我担心我现在已经失去了它),因为我的是WCF服务,我还必须改变听力服务的界面:

  

[WebInvoke(方法=&#34; POST&#34;等]

  

[WebInvoke(方法=&#34; *&#34;等]

答案 1 :(得分:1)

在IIS GUI上的Handler Mappings中,我不得不恢复默认值以取回之前删除的OPTIONSVerbHandler,一旦完成,我将其编辑为IsapiModule而不是ProtocolSupportModule {1}},您还需要设置一个可执行文件&#34;%windir%\ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_isapi.dll&#34;。除了GET请求之外,这还允许我发出POST请求。

PUT和DELETE仍在报告404,直到我重新启用OPTIONSVerbHandler,然后他们开始报告200(OK),但是当我连接调试器时,我看不到他们触摸我的Web服务。

有3个模块称为&#34; ExtensionlessUrlHandler - *&#34;两个用于32/64位,一个用于集成,我只更改了32/64位变体(在经典应用程序池上运行)我,但对于使用集成应用程序池的任何人来说,这里可能需要进行一些实验。

无论如何,我根据&#34;请求限制&#34;编辑了32 / 64bit变体。动词选项卡上的按钮我添加了&#34; PUT,DELETE&#34;所以它读取&#34; GET,HEAD,POST,DEBUG,PUT,DELETE&#34;我的CORS就绪服务中的所有内容都在运行

答案 2 :(得分:0)

我在<remove name="OPTIONSVerbHandler">的{​​{1}}部分中有handlers。我评论它来解决这个问题!

web.config