js到ODATA Web API - CORS请求失败
Breeze.js to ODATA Web API - CORS requests are failing
我正在尝试使用Breeze.js查询基于Microsoft Web API 2的ODATA服务。
当UI和ODATA控制器都在同一个web应用程序中时,一切都如预期的那样工作。
然后我决定把我的数据服务和web应用放到不同的项目中。我安装了所需的CORS包。当我从LinqPad发送查询时,我的数据服务是完全正常的。
但是,Breeze无法解析到达的响应负载。
这是我的相关控制台跟踪:
XHR finished loading: GET "http://localhost:63494/odata/$metadata". (index):1
XHR finished loading: GET "http://localhost:63494/odata/Positions?$filter=(PeriodEndDate%20eq%20dateti…ue%2CCustodianAccountCode%2CCustodianCode%2CSubBusinessUnit%2CStrategyCode".
[Q] Unhandled rejection reasons (should be empty):
["Error↵ at createError (http://localhost:57299/S…/localhost:57299/Scripts/datajs-1.1.3.js:2587:25)"]
q.js:989
在调试器中,我可以看到带有数据的响应从服务器到达,但是Breeze无法从json中解析数据。
我环境:在ODATA服务器端,我安装了以下相关软件包:
<package id="Breeze.EdmBuilder" version="1.0.5" targetFramework="net45" />
<package id="Breeze.Server.ContextProvider" version="1.4.12" targetFramework="net45" />
<package id="Breeze.Server.ContextProvider.EF6" version="1.4.12" targetFramework="net45" />
<package id="Breeze.Server.WebApi2" version="1.4.12" targetFramework="net45" />
<package id="EntityFramework" version="6.1.0" targetFramework="net45" />
<package id="jQuery" version="1.8.2" targetFramework="net40" />
<package id="jQuery.UI.Combined" version="1.8.24" targetFramework="net40" />
<package id="knockoutjs" version="2.2.0" targetFramework="net40" />
<package id="Microsoft.AspNet.Cors" version="5.2.0-rtm-140522" targetFramework="net45" />
<package id="Microsoft.AspNet.Mvc" version="5.2.0-rtm-140521" targetFramework="net45" />
<package id="Microsoft.AspNet.OData" version="5.2.0-rtm-140521" targetFramework="net45" />
<package id="Microsoft.AspNet.Providers.Core" version="1.2" targetFramework="net40" />
<package id="Microsoft.AspNet.Providers.LocalDB" version="1.1" targetFramework="net40" />
<package id="Microsoft.AspNet.Razor" version="3.2.0-rtm-140521" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi" version="5.2.0-rtm-140521" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.0-rtm-140522" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.0-rtm-140522" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Cors" version="5.2.0-rtm-140522" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.OData" version="5.2.0-rtm-140521" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Tracing" version="5.2.0-rtm-140521" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.0-rtm-140521" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages" version="3.2.0-rtm-140521" targetFramework="net45" />
<package id="Microsoft.Data.Edm" version="5.6.1" targetFramework="net45" />
<package id="Microsoft.Data.OData" version="5.6.1" targetFramework="net45" />
<package id="Microsoft.OData.Core" version="6.3.0" targetFramework="net45" />
<package id="Microsoft.OData.Edm" version="6.3.0" targetFramework="net45" />
<package id="Microsoft.Spatial" version="6.3.0" targetFramework="net45" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net40" />
<package id="Newtonsoft.Json" version="6.0.3" targetFramework="net45" />
<package id="System.Spatial" version="5.6.1" targetFramework="net45" />
<package id="WebActivator" version="1.5.3" targetFramework="net45" />
在web应用程序(ODATA客户端)端,我有:
<package id="Antlr" version="3.5.0.2" targetFramework="net45" />
<package id="Breeze.Client" version="1.4.12" targetFramework="net45" />
<package id="Breeze.Server.ContextProvider" version="1.4.12" targetFramework="net45" />
<package id="Breeze.Server.WebApi2" version="1.4.12" targetFramework="net45" />
<package id="datajs" version="1.1.3" targetFramework="net40" />
<package id="DotNetOpenAuth.AspNet" version="4.3.4.13329" targetFramework="net40" requireReinstallation="True" />
<package id="DotNetOpenAuth.Core" version="4.3.4.13329" targetFramework="net40" requireReinstallation="True" />
<package id="DotNetOpenAuth.OAuth.Consumer" version="4.3.4.13329" targetFramework="net40" requireReinstallation="True" />
<package id="DotNetOpenAuth.OAuth.Core" version="4.3.4.13329" targetFramework="net40" requireReinstallation="True" />
<package id="DotNetOpenAuth.OpenId.Core" version="4.3.4.13329" targetFramework="net40" requireReinstallation="True" />
<package id="DotNetOpenAuth.OpenId.RelyingParty" version="4.3.4.13329" targetFramework="net40" requireReinstallation="True" />
<package id="EntityFramework" version="6.1.1-beta1" targetFramework="net45" />
<package id="jQuery" version="2.1.1" targetFramework="net40" />
<package id="jquery.event.drag" version="2.2.0" targetFramework="net40" />
<package id="jQuery.UI.Combined" version="1.10.4" targetFramework="net40" />
<package id="jQuery.Validation" version="1.12.0" targetFramework="net40" />
<package id="knockoutjs" version="3.1.0" targetFramework="net40" />
<package id="Microsoft.AspNet.Mvc" version="5.2.0-rtm-140523" targetFramework="net45" />
<package id="Microsoft.AspNet.Mvc.FixedDisplayModes" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.Razor" version="3.2.0-rtm-140523" targetFramework="net45" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi" version="5.2.0-rtm-140523" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.0-rtm-140523" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.0-rtm-140523" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.OData" version="5.2.0-rtm-140523" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.0-rtm-140523" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages" version="3.2.0-rtm-140523" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages.Data" version="3.2.0-rtm-140523" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages.OAuth" version="3.2.0-rtm-140523" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages.WebData" version="3.2.0-rtm-140523" targetFramework="net45" />
<package id="Microsoft.Bcl" version="1.1.9" targetFramework="net40" requireReinstallation="True" />
<package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net40" />
<package id="Microsoft.Data.Edm" version="5.6.1" targetFramework="net45" />
<package id="Microsoft.Data.OData" version="5.6.1" targetFramework="net45" />
<package id="Microsoft.jQuery.Unobtrusive.Ajax" version="3.2.0-rtm-140523" targetFramework="net45" />
<package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.0-rtm-140523" targetFramework="net45" />
<package id="Microsoft.Net.Http" version="2.2.22" targetFramework="net40" requireReinstallation="True" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net40" />
<package id="Modernizr" version="2.7.2" targetFramework="net45" />
<package id="Newtonsoft.Json" version="6.0.3" targetFramework="net45" />
<package id="Q" version="1.0.0" targetFramework="net45" />
<package id="SlickGrid" version="2.2.20140120" targetFramework="net40" />
<package id="System.Spatial" version="5.6.1" targetFramework="net45" />
<package id="WebActivator" version="1.5.3" targetFramework="net45" />
<package id="WebGrease" version="1.6.0" targetFramework="net45" />
我的控制器在ODATA端看起来像这样:
public class PositionsController : ODataController
{
private AG_DWEntities db = new AG_DWEntities();
public PositionsController()
{
db.Database.Log = s => Debug.WriteLine(s);
}
// GET odata/Positions
[EnableQuery]
public IQueryable<Position> GetPositions()
{
return db.Positions;
}
// GET odata/Positions(5)
[EnableQuery]
public SingleResult<Position> GetPosition([FromODataUri] string key)
{
return SingleResult.Create(db.Positions.Where(position => position.CCY == key));
}
我在数据服务器端使用Breeze的EdmBuilder(而不是odatacontiononmodelbuilder):
private static IEdmModel GetEdmModelModelForBreeze()
{
return EdmBuilder.GetEdm<AG_DWEntities>();
}
CORS通过以下方式启用:
config.EnableCors(new EnableCorsAttribute("*", "*", "*", "*"){ SupportsCredentials = true, PreflightMaxAge = long.MaxValue});
在Web应用中,查询是这样的:
var serverAddress = "http://localhost:63494/odata/";
breeze.config.initializeAdapterInstances({ dataService: "webApiOData" });
var manager = new breeze.EntityManager(serverAddress);
my.vm = {
positions: ko.observableArray([]),
load: function () {
var query = breeze.EntityQuery
.from("Positions")
.where("PeriodEndDate", "==", new Date(Date.UTC(2014, 0, 30, 0, 0, 0, 0)))
.where("Portfolio", "==", "SUPR")
.take(200)
.orderBy("AGPositionKeyId")
.select("ID,Portfolio,AGPositionKeyId,BookEndingMarketValue,CustodianAccountCode,CustodianCode,SubBusinessUnit,StrategyCode");
try {
manager.executeQuery(query)
.then(function(data) {
$.each(data.results, function(i, c) {
my.vm.positions.push(c);
})
.fail(function(e) {
alert(e);
});
});
} catch (e) {
alert(e);
};
},
}
my.vm.load();
ko.applyBindings(my.vm);
我已经看到了这篇文章,并试图从ApiController继承我的控制器并使用Breeze属性,但它也没有工作-我开始得到不同的服务器错误。
感谢您阅读我的长问题!
这个答案解决了我的问题。
从WebApiConfig.cs://THIS DOESN'T WORK:
//var cors = new EnableCorsAttribute("*", "*", "*", null) { SupportsCredentials = true };
//NEITHER DOES THIS:
//var cors = new EnableCorsAttribute("*", "*", "*", "*") { SupportsCredentials = true };
//THIS WORKS:
var cors = new EnableCorsAttribute("*","*","*","DataServiceVersion, MaxDataServiceVersion"){SupportsCredentials = true};
config.EnableCors(cors);
这些响应头是datajs需要的:另一个讨论
相关文章:
- 向localhost发出带有grunt的代理CORS请求
- Node.js cors请求-异步示例不起作用
- 是 CORS 请求,预检耗时
- Pingfederate opentoken模块CORS请求返回302,而不是200
- 在JQuery中启用CORS后,CORS请求被阻止
- 从CORS请求中捕获异步异常
- 无法在 jquery 中获取 Ajax CORS 请求以工作
- 将 CORS 请求发布到运行 sailsjs 的 HTTPS 域
- 授权标头仅在 AJAX CORS 请求中追加一次
- 使用 jQuery 的 CORS 请求 - $.ajax()
- 尝试处理 CORS 请求时出现 ParseError
- Firefox 不允许 CORS 请求,即使服务器返回了相应的响应标头
- CORS 请求与 Safari 一起工作
- IE11未启动CORS请求
- Safari阻止对Express API的CORS请求
- AngularJS不允许CORS请求
- CORS请求处于反应状态
- 为什么此CORS请求失败
- CORS请求结构很难理解,你能帮我解释一下吗
- 如何使用XMLHttpRequest发出CORS请求