我有一组在内部接口上运行的 WCF Web 服务,这些服务由许多其他网站(也仅限内部)调用。域名匹配,只是端口号不同。
我正在向这些 Web 服务发出 AJAX POST 请求,因为它们在技术上不是同一个来源(不同的端口),所以我正在使用 CORS。
在 IE 中一切都很好,(因为我相信 IE 不会将端口视为不同的来源)但是 Opera 和 Firefox 都会发送预检 OPTIONS 请求。
我已将 Web 服务配置为通过 web.config 文件接受这些请求:
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="*" />
我还在我的服务上设置了接口以接受任何 HTTP 动词:
[OperationContract(Name = "H2dbDataExport")]
[WebInvoke(Method = "*", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
string H2dbDataExport(string action, string username, exportDetails data);
然而,这会导致底层服务被调用,并且由于它没有找到它在 POST 请求中期望的任何细节,以标准的“你发送了一些错误”的响应。
如果我将服务更改为仅接受 POST 请求 - 这实际上是它会通过以下方式以任何相同的方式响应的唯一响应:
[WebInvoke(Method = "POST", etc.......
然后预检 OPTIONS 得到“405 - Method not allowed”响应。
我究竟做错了什么?我是否应该配置我的服务以回复 OPTIONS 请求,如果是这样,正确的响应是什么?
我假设我可以在服务中获取请求类型并回复 200 - 好的,如果动词是 OPTIONS 然后重新发送实际的 POST - 但是如果我手动执行此操作,浏览器肯定会再次发送 OPTIONS 作为这是一个新的要求。
编辑:
我刚刚发现这篇文章,关于删除 WEBDAV 处理程序: CORS 405 (Method Not Allowed)
但这没有帮助。
还有一篇关于将 OPTIONSHttpVerb 处理程序移到列表顶部并赋予它“读取”权限的帖子,但这也没有帮助。
编辑 2:实际上移动 OPTIONSHttpVerb 确实有帮助,它不再调用 Web 服务,但 IIS 确实响应 200 - OK。但是,此响应仍会出现在浏览器中的客户端代码中,因此无济于事。
选项响应
HTTP/1.1 200 OK
Allow: OPTIONS, TRACE, GET, HEAD, POST
Server: Microsoft-IIS/7.5
Public: OPTIONS, TRACE, GET, HEAD, POST
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Date: Fri, 05 Jun 2015 10:34:29 GMT
Content-Length: 0