Hook OData的$ metadata响应并将其从XML转换为JSON

时间:2016-12-16 14:48:05

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

Get OData $metadata in JSON format的答案表明默认情况下OData无法将元数据作为JSON返回。

但是有可能捕获或挂钩其对$metadata URL的响应,然后在将其发送到客户端之前将其转换为JSON吗?

我想像这样的伪代码:

[HttpGet]
[ODataRoute("$metadata")]
public string GetMetadataAsJson()
{
    string xml = GetOdataMetadataAsXML();
    string json = ConvertToJson(xml);
    return json;
}

我不知道如何正确实现它,特别是我不知道如何将标准OData响应作为字符串,以及如何挂钩$metadata URL。

1 个答案:

答案 0 :(得分:1)

Newtonsoft 支持 Json 部分结帐 https://www.newtonsoft.com/json/help/html/ConvertXmlToJson.htm

因此,Json 部分的实际解决方案将非常简单,只要您拥有 XML

[HttpGet]
[ODataRoute("$metadata")]
public string GetMetadataAsJson()
{
    string xml = GetOdataMetadataAsXML();
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    string json = JsonConvert.SerializeXmlNode(doc);
    return json;
}

此外,您可能应该首先检查是否例如例如,使用此代码设置格式查询

[HttpGet]
[ODataRoute("$metadata")]
public string GetMetadataAsJson([FromQuery(Name="Format")]string format)
{
    string metaResult = GetOdataMetadataAsXML();
    if(format.Equals("json",StringComparison.OrdinalIgnoreCase))
    {
        XmlDocument metaDoc = new XmlDocument();
        doc.LoadXml(metaResult);
        metaResult = JsonConvert.SerializeXmlNode(doc);
    }
    return metaResult;
}