尽管web.config条目,jQuery AJAX CORS与ASP.NET WCF服务无法正常工作

not*_*not 12 asp.net ajax wcf jquery cors

我试图弄清楚我的方法中缺少的是阻止我的WCF服务被访问的方法.如果我尝试通过来自同一域的AJAX请求访问该服务,则没有问题.

我已经把我在网站上其他地方看到的建议添加到<httpProtocol>web.config中的标签以启用CORS,但它似乎不起作用(请注意customHeaders中的前几个元素是用于不同的安全原因):

<location path="FooBar.svc">
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Request-Method" value="POST"/>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Headers" value="Content-Type, X-Requested-With, X-Custom-Header" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
  </location>
Run Code Online (Sandbox Code Playgroud)

尽管存在这种情况,但在尝试从单独的页面调用服务时仍然会出现错误(使用IE Developer Tools):"XMLHttpRequest for ... required Cross Origin Resource Sharing(CORS)"

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

 crossDomain: true,
 xhrFields: { withCredentials: true },
Run Code Online (Sandbox Code Playgroud)

我甚至尝试从https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js添加针对潜在IE XDR问题的修复,但没有效果(我使用的是IE11,所以我不想不要指望它

任何人都有任何关于这里可能出错的想法?

(编辑:服务本身设置了这些属性,如果它有所不同:

[OperationContract]
[WebInvoke(Method = "POST", 
        BodyStyle = WebMessageBodyStyle.WrappedRequest,
        ResponseFormat = WebMessageFormat.Json)]
Run Code Online (Sandbox Code Playgroud)

)

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

Akk*_*619 7

在托管服务的后端服务器中将CORS设置为true应该理想地解决问题.但是还有一种方法......你可以在jQuery代码和WCF服务之间有一个包装器(注意:当你没有访问权限来修改例如htaccess文件时,这是你必须在团队中建议的方法之一apache我们设置CORS以访问访问我们服务的其他域).所以方法就是这样....

jQuery Code -> Wrapper (Webmethod in .NET) -> WCF service

jQuery代码和Wrapper驻留在同一个域中.jQuery调用webmethod,后者又调用相应的WCF服务方法来获取数据.这种方法的缺点是请求遍历了另一层,这就是我在开头提到Note的原因.


Rom*_*nev 6

您的<customHeaders>web.config部分是为没有凭据的CORS请求设置的.您需要一个不同的配置来允许带有凭据的CORS请求:

  1. 设置一个额外的Access-Control-Allow-Credentials标题true.

  2. Access-Control-Allow-Origin标头无法设置为*.您必须为CORS请求源/主机返回区分大小写的匹配项.

资料来源:7.2资源共享检查(W3C跨域资源共享建议)


vij*_*ayP 5

如果您的服务使用HTTPS,并且使用自签名SSL证书,则尽管已为标头设置完成,但跨域呼叫将失败.您应该尝试将有效的SSL证书导入IIS并查看所获得的内容. web.configAccess-Control-Allow-Origin

  • 这就是浏览器的行为方式.这是为了避免跨站点脚本(XXS)漏洞.为了测试目的克服这个问题; 您可以尝试以下步骤:1)在浏览器的第一个选项卡中打开包含Ajax请求的跨域页面.2)在选项卡2中打开包含WCF服务器的网站的任何HTTPS页面.3)因为您有自签名SSL; 您应该获得证书警告和"我理解风险...继续"消息与链接.4)点击继续链接5)现在再次来到选项卡1,其他域页面6)刷新它,你的Ajax到WCF应该工作.在Prod上,您将拥有有效的SSL. (2认同)

And*_* AR 4

您是否尝试过在 jquery 中使用 $.support.cors = true ?