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

时间:2015-09-11 23:10:52

标签: jquery asp.net ajax wcf cors

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

我已经将我在网站上其他地方看到的建议添加到web.config中的<httpProtocol>标记以启用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>

尽管已经到位,但在尝试从单独的页面调用服务时仍然会出现错误(使用IE Developer Tools):“XMLHttpRequest for ... required Cross Origin Resource Sharing(CORS)”

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

 crossDomain: true,
 xhrFields: { withCredentials: true },

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

有人对这里可能出现的问题有任何想法吗?

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

[OperationContract]
[WebInvoke(Method = "POST", 
        BodyStyle = WebMessageBodyStyle.WrappedRequest,
        ResponseFormat = WebMessageFormat.Json)]

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

4 个答案:

答案 0 :(得分:7)

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

  

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

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

答案 1 :(得分:5)

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

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

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

  3. 来源7.2 Resource Sharing Check (W3C Recommendation for Cross-Origin Resource Sharing)

答案 2 :(得分:5)

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

答案 3 :(得分:-1)

已尝试在Access-Control-Allow-Origin中的标头中添加Response,如下所示(仅当您希望可以从任何域访问您的WCF服务时),

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin","*");

在我的一个Web API方法中,我使用了UrlReferrer。 代码如下所示

Uri referredURL = HttpContext.Current.Request.UrlReferrer;
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://" + referredURL.Host);

但是这种方法风险很小,因为无法保证是否会获得UrlReferrer,因为它取决于客户端(浏览器)。