【问题标题】:CORS using asp.net web api 2 odata and breezeCORS 使用 asp.net web api 2 odata 和微风
【发布时间】:2013-08-04 15:17:24
【问题描述】:

我在使用 Breeze 使用 OData 时遇到问题。我的 api 托管在另一台服务器上,并且我正在使用 asp.net web api 2.0(随 VS 2013 预览版提供)。我知道为 CORS 正确配置了 web api,因为我已经在轻而易举的情况下对其进行了测试,并且运行良好。

这是启用 CORS 的 web api 2.0 代码:

var cors = new EnableCorsAttribute("http://localhost:7122/", "*", "*");
config.EnableCors(cors);

这是我的 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();
}

这里是控制器:

[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);
    }
}

这是我使用微风使用 OData 的方式:

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);
    }

这是我得到的错误:

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

我不明白为什么查询的 url 是:http://localhost:23758/odata/$metadata 而不是 http://localhost:23758/odata/$metadata#MuscleGroup

我知道this 的答案解释了如何将微风与 CORS 一起使用,但我相信这是之前的 web api 2,我不需要编写类来处理 CORS,因为我现在可以这样做:

var cors = new EnableCorsAttribute("http://localhost:7122/", "*", "*"); 

长话短说,我的 api 可以很好地处理 CORS(我已经对其进行了测试),但由于某种原因,它不适用于微风。

编辑

我已经从控制器中删除了这一行 [EnableCors(origins: "http://localhost:7122", headers: "*", methods: "*")],并且刚刚启用了 CROS globbaly,但现在我收到了这个错误:

[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

我不知道这个属性 end 是什么,因为它没有在我的实体中定义

【问题讨论】:

标签: c# asp.net-web-api odata cors breeze


【解决方案1】:
var cors = new EnableCorsAttribute(
    "http://localhost:7122/",
    "*",
    "*",
    "DataServiceVersion, MaxDataServiceVersion"
);
config.EnableCors(cors);

尝试将DataServiceVersionMaxDataServiceVersion 添加到您的EnableCorsAttribute。 这对我有用。我找到了here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 2015-01-28
    • 2016-10-07
    • 2015-07-27
    • 2014-07-30
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多