使用asp.net网页API 2 ODATA和微风CORS [英] CORS using asp.net web api 2 odata and breeze
问题描述
我有问题,我的消费与微风的OData。我的API托管在其他服务器上,而我使用asp.net的web API 2.0(随VS 2013 preVIEW)。我知道网页API正确配置了CORS,因为我没有测试过的微风它,它工作得很好。
下面是网络API 2.0 code使CORS:
VAR CORS =新EnableCorsAttribute(HTTP://本地主机:7122 /,*,*);
config.EnableCors(CORS);
下面是我的IEdmModel
私有静态IEdmModel CreateModel()
{
VAR模型构建器=新ODataConventionModelBuilder {命名空间=Test.Domain.Model};
modelBuilder.EntitySet&所述; MuscleGroup&GT(MuscleGroup);
modelBuilder.EntitySet<运动与GT(练习);
modelBuilder.EntitySet&所述; ExerciseCategory&GT(ExerciseCategories);
modelBuilder.EntitySet<肌肉与GT(肌肉); 返回modelBuilder.GetEdmModel();
}
下面是控制器:
[EnableCors(来源:HTTP://本地主机:7122,标题:*,方法:*)] //这使得CORS的控制器
公共类MuscleGroupController:EntitySetController< MuscleGroup,INT>
{
私人只读DatabaseContext _databaseContext =新DatabaseContext(); [可查询]
公共重写IQueryable的< MuscleGroup>得到()
{
返回_databaseContext.MuscleGroups;
} 保护覆盖MuscleGroup GetEntityByKey(INT键)
{
返回_databaseContext.MuscleGroups.Find(键);
}
}
下面是我如何使用OData使用清风:
app.adminMuscleGroup.dataService =(功能(清风,记录仪){ breeze.config.initializeAdapterInstances({DataService的:OData的}); VAR SERVICENAME =HTTP://本地主机:23758 / ODATA /; VAR经理=新breeze.EntityManager(服务名称); manager.enableSaveQueuing(真); VAR的DataService = {
GETALL:GETALL,
}; DataService的回报; 功能GETALL(){
VAR的查询= breeze.EntityQuery.from(MuscleGroup)的OrderBy(姓名); 返回manager.executeQuery(查询);
}
和这里的错误,我得到:
无法加载资源:服务器与400(错误请求)HTTP的状态回应://本地主机:23758 / ODATA / $元
无法加载资源:产地HTTP://本地主机:7122不被访问控制允许来源允许的。 HTTP://本地主机:23758 / ODATA / $元
XMLHtt prequest无法加载的http://本地主机:23758 / ODATA / $的元数据。原产地的http://本地主机:7122不被访问控制允许来源允许的。 MuscleGroup:1
[Q]未处理拒绝的理由(应为空):
数组[0]
q.js:891
错误:元数据查询失败:HTTP://本地主机:23758 / ODATA / $元数据; Logger.js:52
我不明白就是为什么网址查询:的http://本地主机:23758 / ODATA / $元
而不是 HTTP ://本地主机:23758 / ODATA / $#元MuscleGroup
我知道这回答解释了如何使用微风CORS,但我相信这是以前的网络API 2和我不需要编写类CORS处理,我可以现在就做:
VAR CORS =新EnableCorsAttribute(HTTP://本地主机:7122 /,*,*);
长话短说,我的API处理CORS好(我已经测试过),但由于某种原因,它不与招展工作。
修改
我已经删除了此行 [EnableCors(来源:HTTP://本地主机:7122,标题:*,方法:*)]
从控制器和刚启用CROS globbaly,但现在我得到这个错误:
[Q]未处理拒绝的理由(应为空):
数组[0]
q.js:891
错误:元数据查询失败的http://本地主机:23758 / ODATA / $元数据;无法处理返回的元数据:无法读取空Logger.js财产结束:52
我不知道这是什么性质的结束的是,因为它是不是在我的实体定义
VAR CORS =新EnableCorsAttribute(
HTTP://本地主机:7122 /,
*,
*,
DataServiceVersion,MaxDataServiceVersion
);
config.EnableCors(CORS);
尝试添加 DataServiceVersion
和 MaxDataServiceVersion
你的 EnableCorsAttribute
。
这为我工作。我发现它<一个href=\"http://stackoverflow.com/questions/23375964/breeze-query-error-even-though-results-returned\">here.
I have problem consuming my OData with Breeze. My api is hosted on another server, and I'm using asp.net web api 2.0 (which comes with VS 2013 preview). I know web api is properly configured for CORS, because I've tested it without breeze, and it worked fine.
Here is web api 2.0 code which enables CORS:
var cors = new EnableCorsAttribute("http://localhost:7122/", "*", "*");
config.EnableCors(cors);
Here is my IEdmModel
private static IEdmModel CreateModel()
{
var modelBuilder = new ODataConventionModelBuilder {Namespace = "Test.Domain.Model"};
modelBuilder.EntitySet<MuscleGroup>("MuscleGroup");
modelBuilder.EntitySet<Exercise>("Exercises");
modelBuilder.EntitySet<ExerciseCategory>("ExerciseCategories");
modelBuilder.EntitySet<Muscle>("Muscle");
return modelBuilder.GetEdmModel();
}
Here is controller:
[EnableCors(origins: "http://localhost:7122", headers: "*", methods: "*")] //this enables CORS for controller
public class MuscleGroupController : EntitySetController<MuscleGroup, int>
{
private readonly DatabaseContext _databaseContext = new DatabaseContext();
[Queryable]
public override IQueryable<MuscleGroup> Get()
{
return _databaseContext.MuscleGroups;
}
protected override MuscleGroup GetEntityByKey(int key)
{
return _databaseContext.MuscleGroups.Find(key);
}
}
Here is how I consume OData using breeze:
app.adminMuscleGroup.dataService = ( function(breeze, logger) {
breeze.config.initializeAdapterInstances({ dataService: "OData" });
var servicename = "http://localhost:23758/odata/";
var manager = new breeze.EntityManager(servicename);
manager.enableSaveQueuing(true);
var dataService = {
getAll: getAll,
};
return dataService;
function getAll() {
var query = breeze.EntityQuery.from("MuscleGroup").orderBy("Name");
return manager.executeQuery(query);
}
And here is error I get:
Failed to load resource: the server responded with a status of 400 (Bad Request) http://localhost:23758/odata/$metadata
Failed to load resource: Origin http://localhost:7122 is not allowed by Access-Control-Allow-Origin. http://localhost:23758/odata/$metadata
XMLHttpRequest cannot load http://localhost:23758/odata/$metadata. Origin http://localhost:7122 is not allowed by Access-Control-Allow-Origin. MuscleGroup:1
[Q] Unhandled rejection reasons (should be empty):
Array[0]
q.js:891
Error: Metadata query failed for: http://localhost:23758/odata/$metadata; Logger.js:52
What I don't get is why url for query is: http://localhost:23758/odata/$metadata
instead of http://localhost:23758/odata/$metadata#MuscleGroup
I know this answer explains how to use breeze with CORS, but I believe this was prior web api 2 and that I don't need to write class for CORS handling as I can do it now with:
var cors = new EnableCorsAttribute("http://localhost:7122/", "*", "*");
Long story short, my api handles CORS well (I've tested it) but for some reason it doesn't work with breeze.
EDIT
I've deleted this line [EnableCors(origins: "http://localhost:7122", headers: "*", methods: "*")]
from controller, and just enabled CROS globbaly, but now I get this error:
[Q] Unhandled rejection reasons (should be empty):
Array[0]
q.js:891
Error: Metadata query failed for http://localhost:23758/odata/$metadata; Unable to process returned metadata: Cannot read property 'end' of null Logger.js:52
And I don't know what this property end is, as it isn't defined in my entities
var cors = new EnableCorsAttribute(
"http://localhost:7122/",
"*",
"*",
"DataServiceVersion, MaxDataServiceVersion"
);
config.EnableCors(cors);
Try adding DataServiceVersion
and MaxDataServiceVersion
to your EnableCorsAttribute
.
This worked for me. I found it here.
这篇关于使用asp.net网页API 2 ODATA和微风CORS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!