如果我理解你的问题,你试图在服务器上模拟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);
}
}