gpt4 book ai didi

c# - CORS 使用 asp.net web api 2 odata 和 breeze

转载 作者:行者123 更新时间:2023-12-02 04:55:41 25 4
gpt4 key购买 nike

我在使用 Breeze 时遇到了问题。我的 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();
}

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

以下是我使用 breeze 使用 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/$元数据#肌肉群

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

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

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

编辑

我已经从 Controller 中删除了这一行 [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 是什么,因为它没有在我的实体中定义

最佳答案

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

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

关于c# - CORS 使用 asp.net web api 2 odata 和 breeze,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18032360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com