Webapi CORS 不适用于 breezejs/Odata V4

本文关键字:Odata V4 breezejs 适用于 CORS 不适用 Webapi | 更新日期: 2023-09-27 18:32:44

我正在尝试在我的webapi上启用CORS,以便我可以使用breezejs从另一个项目中使用它。在我的 webapi 中,我启用了 OData V4 并为 breeze 创建了一个 edm 模型,如下所示:

ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<ModuleEntity>("ModuleEntities");
builder.EntitySet<DomainEntity>("DomainEntities");
builder.EntitySet<ApiUserEntity>("ApiUserEntities");
config.MapODataServiceRoute(
    routeName: "ODataRoute",
    routePrefix: "",
    model: builder.GetEdmModel());

所有三个实体集都有自己的从 ODataControllers 派生的控制器。

我已经在我的 webapi 中启用了 cors,如下所示:

// see http://stackoverflow.com/questions/18032360/cors-using-asp-net-web-api-2-odata-and-breeze for last 2 parameters
var cors = new EnableCorsAttribute("*", "*", "*", "DataServiceVersion, MaxDataServiceVersion"); // origins, headers, methods
config.EnableCors(cors);

当我尝试访问 localhost:22594/$metadata 时,我得到了正确的 xml 返回,其中包含上面配置的 EDM 模型数据。

从我的网络项目中使用 breezejs 和 Firefox 但是我收到消息,当它尝试查询 localhost:22594/$metadata 时,cors 未启用,并且不允许我从该来源读取它。

我正在执行微风查询,如下所示:

// setup dataservice
this.dataService = new this.breeze.DataService({
    serviceName: "http://localhost:22594/"
 });
// initialize adapter with OData as dataservice
this.breeze.config.initializeAdapterInstances({ dataService: "OData" });
this.manager = new this.breeze.EntityManager({ dataService: this.dataService });
// query ApiUser entity
var query = this.breeze.EntityQuery().from("ApiUser");
// execute query 
this.manager.executeQuery(query);

我仍然是 breezejs 的新手,所以现在我不知道我的错误在于 breezejs 的使用还是我的 webaopi 配置。我尝试了很多事情,但我似乎无法弄清楚我做错了什么。

Webapi CORS 不适用于 breezejs/Odata V4

我可能已经找到了解决方案。首先,我不得不切换回 odata v3。事实证明,breezejs/datajas 还与 v4 不兼容。

之后,我遇到了一条新的错误消息,说它无法读取 null 的"结束"。也找不到有关该消息的任何内容,因此进行了一些实验。事实证明,我所有的模型类都在各自的文件夹中。我为每个实体使用不同的命名空间。

来自 breezejs 文档:(http://www.getbreezenow.com/documentation/odata-server)

如果您的模型类具有多个命名空间,则会陷入困境。 据我们所知,Web API OData 无法处理位于多个命名空间中的模型类。

我将每个实体放在同一个文件夹中,以便它们都使用相同的命名空间,瞧!我现在终于可以使用 odata 使用 breezejs 查询我的 webapi!