WebAPI OData $格式为xml

ste*_*jnl 6 c# xml asp.net odata asp.net-web-api

对于我的WebAPI OData应用程序,我试图让我的客户端(浏览器)决定数据输出应该是什么格式.由于$ format尚未在WebAPI OData中实现,我在这里使用Raghuramn的示例:https://gist.github.com/raghuramn/5556691

var queryParams = request.GetQueryNameValuePairs();
var dollarFormat = queryParams.Where(kvp => kvp.Key == "$format").Select(kvp => kvp.Value).FirstOrDefault();

if (dollarFormat != null)
{
    request.Headers.Accept.Clear();
    request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(dollarFormat));

    // remove $format from the request.
    request.Properties[HttpPropertyKeys.RequestQueryNameValuePairsKey] = queryParams.Where(kvp => kvp.Key != "$format");
}
Run Code Online (Sandbox Code Playgroud)

这适用于JSON($ format = application/json; odata = fullmetadata)和JSON light(format = application/json; odata = light),但到目前为止还不适用于xml.

如果我将$ format = application/XML添加到查询字符串,它仍然输出到json light.我如何强制XML输出?

编辑:

即使我通过发送 带有请求的Content-type:application/xmlAccept:application/xml 强制在Fiddler中 使用xml,响应只会列出:Content-Type:application/json; 的OData = minimalmetadata; 流= TRUE; 字符集= utf-8的

编辑2:

接受:application/atom + xml似乎确实在原始响应中输出xml.不幸的是,"application/atom + xml"会抛出FormatException:

request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/atom+xml"));
Run Code Online (Sandbox Code Playgroud)

ste*_*jnl 4

设置请求 ContentType 而不是 AcceptHeader 就可以解决问题:

request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/atom+xml");
Run Code Online (Sandbox Code Playgroud)

  • 对我不起作用。您能告诉我您使用什么版本的 Web API 和 OData 库吗?我正在使用 Web API 2.2(5.2.2 程序集版本)和 OData lib v. 6.7.0。 (2认同)