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

sas*_*alm 11 c# json odata asp.net-web-api

以JSON格式获取OData $元数据的答案表明OData默认情况下不能将元数据作为JSON返回.

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

我想像这样的伪代码:

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

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

Fab*_*amp 1

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

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

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

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

[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;
}
Run Code Online (Sandbox Code Playgroud)