是否有办法以可以序列化为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适配器,因为它使用不同的元数据。
答案 0 :(得分:2)
如果我理解您的问题,那么您正尝试在服务器上模拟GET /$metadata
,以便将结果存储在文件中。在ASP.NET OData中,$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);
}
}
答案 1 :(得分:0)
是的,只有在读取OData响应时,Breeze才能正确处理OData元数据。 MetadataStore不直接导入/导出它。
我认为最简单的方法是创建一个单独的客户端代码
不优雅,但它完成了工作。
breeze.server.net的某些未来版本将在服务器上执行OData-to-Breeze元数据转换,因此我们不会遇到此问题。