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

Posted

技术标签:

【中文标题】OPTIONS 预检请求未到达 IIS 托管服务【英文标题】:OPTIONS preflight request doesn't reach IIS hosted service 【发布时间】:2013-10-02 05:56:01 【问题描述】:

我有一个本地主机网站和一个 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 本身处理。然后我关注this 和this SO 帖子并从站点中删除了 OPTIONSVerbHandler 并在 IIS 管理器 UI(而不是 web.conf)中添加“OPTIONS、PUT、POST & DELETE”作为允许的 HTTP 动词,这让我进步了到我的 404 消息。我已经查看了 WebDav,它被突出显示为一个问题,但我没有禁用/删除它,因为我不知道如何但已经读到它只影响“PUT & DELETE”操作,而我的“POST”操作也是失败。

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

TY

【问题讨论】:

【参考方案1】:

尽管 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 请求通过了,一切正常。

希望能帮助那些被逼疯的人。

编辑:

正如另一篇 SO 帖子中所述(恐怕我现在已经丢失了),因为我的服务是 WCF 服务,所以我还必须从以下位置更改监听服务的接口:

[WebInvoke(Method = "POST", etc]

[WebInvoke(Method = "*", etc]

【讨论】:

圣烟。谢谢!我已经搞砸了几个小时。我的 UrlScan.ini 中唯一的区别是 OPTIONS 动词也包含在 Deny 部分中。所以我不得不将它添加到 AllowVerbs 中并从 DenyVerbs 中删除它。我希望这能让人们恢复几分钟的生活。【参考方案2】:

在 IIS GUI 上的处理程序映射中,我必须恢复默认值才能取回我之前删除的 OPTIONSVerbHandler,完成后我将其编辑为 IsapiModule 而不是 ProtocolSupportModule,您还需要设置可执行文件“%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll”。除了 GET 请求之外,这还允许我发出 POST 请求。

在我重新启用 OPTIONSVerbHandler 之前,PUT 和 DELETE 仍然报告 404,然后它们开始报告 200(OK),尽管在我附加调试器时我看不到它们接触我的 Web 服务。

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

无论如何,我编辑了 32/64 位变体,在动词选项卡上的“请求限制”按钮下,我添加了“PUT、DELETE”,因此它显示为“GET、HEAD、POST、DEBUG、PUT、DELETE”以及我的所有内容CORS 就绪服务正在运行

【讨论】:

【参考方案3】:

我在web.confighandlers 部分中有&lt;remove name="OPTIONSVerbHandler"&gt;。我将其注释掉以解决问题!

<system.webServer>
    <handlers>
      <!--<remove name="OPTIONSVerbHandler" />-->     
    </handlers> 
</system.webServer>

【讨论】:

以上是关于OPTIONS 预检请求未到达 IIS 托管服务的主要内容,如果未能解决你的问题,请参考以下文章

在提琴手工作之前,CORS 预检请求不会命中 IIS

Azure 代理,请求 IIS 托管 API 时出现 CORS 错误

为啥会有OPTIONS请求

GraphQL 网关`预检请求未通过访问控制检查`

CORS:为啥我的浏览器不发送 OPTIONS 预检请求?

CORS 问题:预检响应具有无效的 HTTP 状态代码 403