有没有办法以编程方式生成从 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。
以下帮助程序会将服务元数据写入给定流。对于model
和config
参数,应传递用于服务配置的相同对象。
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 元数据;元数据存储不会直接导入/导出它。
我认为处理此问题的最简单方法是创建一个单独的客户端代码,它将
- 创建一个实体管理器,该管理器将
- 从 OData 服务器提取元数据
- 从元数据存储中导出元数据
- 记录元数据,以便您可以捕获它并将其存储在文件中
不优雅,但它可以完成工作。
breeze.server.net 的某些未来版本将在服务器上执行 OData-to-Breeze 元数据转换,因此我们不会遇到此问题。