我正试图找出我的方法中缺少的阻止我的WCF服务被访问的东西。如果我尝试通过来自同一域的AJAX请求访问该服务,那么就没有问题了
我已经采纳了我在网站其他地方看到的建议,将其添加到<;httprotocol>tag以启用CORS,但它似乎不起作用(注意CustomHeader中的前几个元素出于不同的安全原因):
<;位置路径=“FooBar.svc”>;
<;system.webServer>;
<;httprotocol>;
<;自定义标题>;
<;添加name=“访问控制请求方法”value=“POST”/>;
<;添加name=“访问控制允许原点”值=“*”/>;
<;添加name=“访问控制允许标题”value=“内容类型,X-request-With,X-Custom-Header”/>;
</自定义标题>;
</httprotocol>;
</system.webServer>;
</地点>;
尽管这样做了,但在尝试从单独的页面调用服务时(使用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的原因