我在使用 Breeze 使用 OData 时遇到问题。我的 api 托管在另一台服务器上,并且我使用的是 asp.net web api 2.0(随 VS 2013 预览版提供)。我知道 web api 已为 CORS 正确配置,因为我已经在没有微风的情况下对其进行了测试,并且运行良好。
这是启用 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 for query 是:http://localhost:23758/odata/$metadata
而不是http://localhost:23758/odata/$metadata#MuscleGroup
我知道这个答案解释了如何将微风与 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是什么,因为它没有在我的实体中定义