0

有没有人有过让 Breeze(或就此而言的 DataJS)与需要 Windows 身份验证并托管在不同服务器上的 Web API 2 OData 端点进行通信的经验?

我已成功配置 Web API 以启用 CORS,并且能够使用 jQuery 向 OData 端点发起跨域请求:

load: function () {
    $.ajax({
        type: "GET",
        dataType: 'json',
        url: "http://services.company.com/odata/GeographicalRegions",
        xhrFields: {
            withCredentials: true
        },
        crossDomain: true
    }).success(function(data) {
        $.each(data.value, function (i, c) {
            my.vm.geographicalRegions.push(new GeographicalRegion().Id(c.Id).Code(c.Code).Name(c.Name));
        });
    });
}

但是,尝试使用 Breeze 总是会在 Chrome 中出现以下一组错误:

> 选项 http://services.company.com/odata/GeographicalRegions 401(未经授权)datajs-1.1.3.js:2608
> 选项 http://services.company.com/odata/GeographicalRegions 请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问来源“http://project.company.com”。数据js-1.1.3.js:2608
> XMLHttpRequest 无法加载 http://services.company.com/odata/GeographicalRegions。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问来源“http://project.company.com”。示例.html:1
> 未捕获 #<对象>

我认为问题不是由 BreezeJS 库而是由 DataJS 提出的,所以我重新编写了代码以使用 DataJS 进行测试。但是,我不知道如何告诉 OData.read 使用当前凭据发出请求......所以,我尝试了下一个最好的方法(我希望在生产环境中避免):

load: function () {
    OData.read({
        requestUri: "http://services.company.com/odata/GeographicalRegions",
        user:"username", 
        password:"password"
    }, function(data) {
        $.each(data.results, function(i, c) {
            my.vm.geographicalRegions.push(new GeographicalRegion().Id(c.Id).Code(c.Code).Name(c.Name));
        });
    });
}

错误仍然存​​在......关于如何克服这个问题的任何想法?我讨厌使用 jQuery……这是一个很棒的库,但我希望使用 DataJS 加快开发周期。

一个主要警告...由于客户要求,解决方案必须支持 IE 8。这只是让 JayData 退出了竞争。

4

1 回答 1

1

IE8 不支持 CORS。这可能是问题吗?

您可能已经发现,标准的 Breeze OData 数据服务适配器委托给 DataJS。

默认情况下,DataJS 会进行自己的 AJAX 调用,直接与浏览器对话,XMLHttpRequest除非您替换为自己的 http 客户端。你也许可以跟随他们的领导,根据 jQuery 在后台所做的任何事情来调整标题。

我从来没有发现 jQuerycrossDomain配置值得修补。不久前我深入研究了crossDomain代码并得出结论,如果它不兼容 CORS,它就无法神奇地使浏览器 CORS 兼容。

但是,如果您可以使用 jQuery,您可以告诉 DataJS 使用您自己的 jQuery AJAX 包装器。Breeze 永远不会知道或关心它。

于 2014-12-10T22:49:33.737 回答