使用asp.net网页API 2 ODATA和微风CORS [英] CORS using asp.net web api 2 odata and breeze

查看:223
本文介绍了使用asp.net网页API 2 ODATA和微风CORS的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有问题,我的消费与微风的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆