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

标签 jquery asp.net ajax wcf 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>

尽管如此,当我尝试从单独的页面调用该服务时,我仍然收到错误(使用 IE 开发工具):“XMLHttpRequest for ... required Cross Origin ResourceSharing (CORS)”

我的 jQuery ajax 调用(Post)也设置了与 CORS 一起使用的值:

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

我什至尝试添加针对潜在 IE XDR 问题的修复程序,来自 https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js ,没有效果(我使用的是 IE11,所以我没想到它)

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

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

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

)

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

最佳答案

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

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

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

关于尽管有 web.config 条目,带有 ASP.NET WCF 服务的 jQuery AJAX CORS 仍无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32533371/

相关文章:

jquery - iPad 和视差效果

javascript - 在 fancybox 2 的弹出窗口中显示上一张和下一张图像

javascript - Meteor:如何根据数据库中的值设置单选按钮的值

javascript - 防止父 div 在子 div 调整大小时调整大小

asp.net - 将所有页面内容放入 Web 用户控件中是一个很好的做法吗?

asp.net - 将 appsettings.product.json 发布到 azure

c# - 格式化对象 ToString

javascript - 如何在javascript中使用preventDefault删除默认操作?

javascript - 使用 AJAX 根据数据库输出动态附加 <tr>

javascript - 在 $.ajax 回调中,如何区分无法访问的服务器和正在离开的用户?