2016-04-21 55 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); 
    } 
}