有没有人有过让 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 退出了竞争。