4

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

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

4

3 回答 3

6

尽管 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(方法=“POST”等]

[WebInvoke(方法=“*”等]

于 2015-03-09T15:06:03.110 回答
1

在 IIS GUI 上的处理程序映射中,我必须恢复默认值才能取回OPTIONSVerbHandler我之前删除的内容,一旦完成,我将其编辑为 anIsapiModule而不是 a 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 就绪服务中的所有内容正在工作中

于 2013-09-26T12:55:49.953 回答
0

我有<remove name="OPTIONSVerbHandler">在我的handlers部分web.config。我将其注释掉以解决问题!

<system.webServer>
    <handlers>
      <!--<remove name="OPTIONSVerbHandler" />-->     
    </handlers> 
</system.webServer>
于 2016-02-14T22:32:37.317 回答