2016-04-21 35 views
1

有沒有一種方法可以以可序列化爲XML的方式以編程方式生成從ASP.Net Web Api OData控制器路由返回的/ $元數據響應?以編程方式生成Asp Net Web Api OData路由元數據

我想這樣做的原因是,我使用breeze使用OData適配器訪問Web API,並且希望使用元數據預先加載Breeze MetadataStore,就像在這個http://breeze.github.io/doc-js/metadata-load-from-script.html 中一樣。

但是這個例子似乎不適用於OData適配器,因爲它使用了不同的元數據。

回答

0

確實,OData元數據僅在讀取OData響應時由Breeze正確處理; MetadataStore不直接導入/導出它。

我認爲處理這個最簡單的方法是創建的客戶端代碼的獨立位將

  1. 創建一個EntityManager將
  2. 從OData的服務器
  3. 出口獲取元數據從MetadataStore
  4. 登錄元數據的元數據,以便你可以捕捉它,並將其存儲在一個文件

不優雅,但它完成了工作。

某些未來版本的breeze.server.net將在服務器上進行OData-to-Breeze元數據轉換,所以我們不會遇到這個問題。

2

如果我理解你的問題,你試圖在服務器上模擬GET /$metadata,所以你可以將結果存儲在一個文件中。在ASP.NET OData中,$metadata由實現IEdmModel的對象(例如調用ODataModelBuilder.GetEdmModel的結果)表示。問題就變成了如何將該模型序列化爲XML。

以下幫助程序會將服務元數據寫入給定的流。對於modelconfig參數,應該傳遞用於服務配置的相同對象。

public class MetadataHelper 
{ 
    public static Task WriteMetadataAsync(Stream stream, IEdmModel model, HttpConfiguration config, string odataRouteName) 
    { 
     var request = new HttpRequestMessage(HttpMethod.Get, "/$metadata"); 

     request.ODataProperties().Model = model; 
     request.ODataProperties().RouteName = odataRouteName; 
     request.SetConfiguration(config); 

     var payloadKinds = new List<ODataPayloadKind> { ODataPayloadKind.MetadataDocument }; 
     var xmlMediaType = new MediaTypeHeaderValue("application/xml"); 
     var formatter = new ODataMediaTypeFormatter(payloadKinds).GetPerRequestFormatterInstance(model.GetType(), request, xmlMediaType); 
     var content = new StringContent(String.Empty); 

     content.Headers.ContentType = xmlMediaType; 

     return formatter.WriteToStreamAsync(model.GetType(), model, stream, content, null); 
    } 
}