BreezeJS 不查询 CORS OData Web API 服务
本文关键字:Web API 服务 OData CORS 查询 BreezeJS | 更新日期: 2023-09-27 18:33:32
我正在尝试使用 breezejs 来查询托管在单独的应用程序实例/域中的 webapi odata 服务。
我已经按照官方 BreezeJS 网站上的描述设置了所有内容,这篇博文的代码是相同的,只是服务地址将在另一个域上。
下面是代码示例:
var serverAddress = 'http://mydomain.com:49074/odata/';
breeze.config.initializeAdapterInstances({ dataService: "OData" });
var manager = new breeze.EntityManager(serverAddress);
var query = breeze.EntityQuery.from('Technology').where("Id", ">", 3); //!!!not executed
manager.executeQuery(query, function (data) {
debugger;
alert('tada');
});
这种形成的查询不会执行,但它应该可以工作。并得到这样的回应:
头:
请求网址:http://mydomain.com:49074/odata/$metadata
请求方式:获取
状态代码:200 OK
响应:
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
<edmx:DataServices m:DataServiceVersion="3.0" m:MaxDataServiceVersion="3.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<Schema Namespace="Devup.Model" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityType Name="Technology">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" Nullable="false" />
</EntityType>
</Schema>
<Schema Namespace="WebAPIODataWithBreezeConsumer.Models" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityContainer Name="Container" m:IsDefaultEntityContainer="true">
<EntitySet Name="Technology" EntityType="Devup.Model.Technology" />
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
但是注意到,如果我将查询更新为:
var 查询 = 微风。EntityQuery.from('technology?'(.其中("Id", ">", 3(;
或
var 查询 = 微风。EntityQuery.from('Technology/'(.where("Id", ">", 3(;
然后我命中了后端代码(断点(,它不会过滤结果,而是命中后端......
有谁知道为什么会有这种奇怪的行为以及如何解决这个问题
不确定发生了什么,但您可以通过将元数据查询与数据查询隔离来简化问题。 默认情况下,Breeze 会在尝试执行查询本身之前尝试解析任何查询的元数据。 元数据解析只需为每个数据服务终结点执行一次,并且通常在第一次查询时显示为两次往返。 这可能会使调试问题变得困难。
另一种方法是通过通过以下方式显式执行元数据查询,强制元数据查询在第一次数据查询之前发生
// fetch the metadata
myEntityManager.fetchMetadata().then(function() {
return myEntityManager.executeQuery(myQuery);
}).then(function(data) {
// fetch the data
var results = data.results;
});
通过此设置,您可以确定是元数据查询失败还是数据查询失败。