2013-09-30 61 views
0

我試圖使用breezejs查詢託管在單獨的應用程序實例/域中的webapi odata服務。BreezeJS不查詢CORS OData web api服務

我已經設置了所有類似於official BreezeJS sitethis blog post中描述的代碼,除了服務地址將位於另一個域中外,代碼是相同的。

下面是代碼示例:不執行

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

這樣形成查詢,但它應該工作。並得到這樣的迴應:

頭:

請求URL:http://mydomain.com:49074/odata/ $元
請求方法:GET
狀態代碼: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的查詢= breeze.EntityQuery.from( '?科技'),其中( 「ID」, 「>」,3);

OR

變種查詢= breeze.EntityQuery.from( '技術/'),其中( 「ID」, 「>」,3);

然後我打的後端代碼(斷點),它過濾的結果,但命中後端...

有誰知道爲什麼這樣奇怪的行爲,以及如何解決這個問題

回答

0

不太確定發生了什麼,但是您可以通過從數據查詢中分離元數據查詢來簡化問題。默認情況下,Breeze嘗試在嘗試執行查詢本身之前解析任何查詢的元數據。元數據解析只需要在每個數據服務端點出現一次,並且通常在第一次查詢時顯示爲兩次往返。這可能會使調試問題變得困難。

另一種方法是通過顯式地進行元數據查詢通過

// fetch the metadata 
myEntityManager.fetchMetadata().then(function() { 
    return myEntityManager.executeQuery(myQuery); 

}).then(function(data) { 
// fetch the data 
    var results = data.results; 
}); 

強制元數據查詢您的第一個數據查詢之前發生有了這個設置,您可以或者確定的元數據查詢失敗的數據查詢失敗了。