尽管有web.config条目,但具有ASP.NET WCF服务的jQuery AJAX CORS仍无法工作

我正试图找出我的方法中缺少的阻止我的WCF服务被访问的东西。如果我尝试通过来自同一域的AJAX请求访问该服务,那么就没有问题了

我已经采纳了我在网站其他地方看到的建议,将其添加到<httprotocol&gttag以启用CORS,但它似乎不起作用(注意CustomHeader中的前几个元素出于不同的安全原因):

<位置路径=“FooBar.svc”>
<system.webServer>
<httprotocol>
<自定义标题>
<添加name=“访问控制请求方法”value=“POST”/>
<添加name=“访问控制允许原点”值=“*”/>
<添加name=“访问控制允许标题”value=“内容类型,X-request-With,X-Custom-Header”/>
&lt/自定义标题>
&lt/httprotocol>
&lt/system.webServer>
&lt/地点>

尽管这样做了,但在尝试从单独的页面调用服务时(使用IE开发人员工具),我仍然会遇到一个错误:“XMLHttpRequest for…required Cross-Origin Resource Share(CORS)”

我的jQuery ajax调用(Post)设置了用于CORS的值:

跨域:真,
xhrFields:{withCredentials:true},

我甚至尝试为潜在的IE XDR问题添加修复程序,从https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js,没有效果(我使用的是IE11,所以我没有预料到)

有人知道这里可能出了什么问题吗

(编辑:服务本身是使用这些属性设置的,如果它有区别:

[运营合同]
[WebInvoke(Method=“POST”,
BodyStyle=WebMessageBodyStyle.WrappedRequest,
ResponseFormat=WebMessageFormat.Json)]

)

(编辑2:如果有意义,服务必须是使用表单身份验证的全HTTPS站点的一部分,并且服务需要使用与站点相同的登录凭据。
)

在承载服务的后端服务器中启用CORS应该可以理想地解决这个问题。然而还有一种方法。。。您可以在jQuery代码和WCF服务之间设置一个包装器(注意:当您无权修改例如apache中的htaccess文件时,这是您在团队中建议的方法之一,在apache中,我们将CORS设置为可以访问访问我们服务的其他域)。所以方法是这样的

jQuery代码->包装器(.NET中的Webmethod)>WCF服务

jQuery代码和包装器位于同一个域中。jQuery调用webmethod,然后调用相应的WCF服务方法来获取数据。这种方法的缺点是请求又遍历了一层,这就是我在开头提到Note的原因

发表评论