以编程方式生成Asp Net Web Api OData路由元数据

时间:2016-04-21 15:52:00

标签: c# asp.net asp.net-web-api odata breeze

是否有办法以可以序列化为XML的方式以编程方式生成从ASP.Net Web Api OData控制器路由返回的/ $元数据响应?

我想这样做的原因是我使用breeze使用OData适配器访问Web API,并希望使用元数据预加载Breeze MetadataStore,如http://breeze.github.io/doc-js/metadata-load-from-script.html中所示。 example

但是这个例子似乎不适用于OData适配器,因为它使用不同的元数据。

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

是的,只有在读取OData响应时,Breeze才能正确处理OData元数据。 MetadataStore不直接导入/导出它。

我认为最简单的方法是创建一个单独的客户端代码

  1. 创建一个
  2. 的EntityManager
  3. 从OData服务器获取元数据
  4. 从MetadataStore导出元数据
  5. 记录元数据,以便捕获它并将其存储在文件中
  6. 不优雅,但它完成了工作。

    breeze.server.net的某些未来版本将在服务器上执行OData-to-Breeze元数据转换,因此我们不会遇到此问题。