以编程方式生成 ASP 网络 Web API OData 路由元数据



有没有办法以编程方式生成从 ASP.Net Web API OData 控制器路由返回的/$metadata 响应,并且可以序列化为 XML?

我想这样做的原因是,我正在使用 breeze 使用 OData 适配器访问 Web API,并希望使用元数据预加载 Breeze 元数据存储,就像在 http://breeze.github.io/doc-js/metadata-load-from-script.htmlexample 中一样。

但此示例似乎不适用于 OData 适配器,因为它使用不同的元数据。

如果我理解您的问题,您正在尝试在服务器上模拟GET /$metadata,以便可以将结果存储在文件中。在 OData ASP.NET 中,$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);
    }
}

没错,只有在读取 OData 响应时,Breeze 才会正确处理 OData 元数据;元数据存储不会直接导入/导出它。

我认为处理此问题的最简单方法是创建一个单独的客户端代码,它将

  1. 创建一个实体管理器,该管理器将
  2. 从 OData 服务器提取元数据
  3. 从元数据存储中导出元数据
  4. 记录元数据,以便您可以捕获它并将其存储在文件中

不优雅,但它可以完成工作。

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

最新更新