ASP.NET WebApi根据请求标头返回XML或json

时间:2018-07-20 12:52:00

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

在我的ASP.NET项目中,所有WebApi都回复了json。因此,我在WebApiConfig.cs中设置了

config.Formatters.Clear();
config.Formatters.Add(new JsonMediaTypeFormatter());

现在,我只需要更改一个webapi即可根据标头中的请求返回XML。

最佳做法是什么?有例子吗?

2 个答案:

答案 0 :(得分:0)

enter image description here将此添加到您的配置中:

config.Formatters.XmlFormatter.UseXmlSerializer = true;

然后同时进行xml和json序列化, 当您将请求的接受标头设置为“ application / xml,xml / text”时,您将获得xml,如果将标头设置为“ application / json,json / text”,则将获得json结果 它叫做content negotiation

另一种方法是使用特定方法将对象序列化为xml

答案 1 :(得分:0)

根据您的评论,我更新了WebApiConfig.cs

public static void Register(HttpConfiguration config)
{
    config.Formatters.Clear();
    config.Formatters.Add(new JsonMediaTypeFormatter());
    config.Formatters.Add(new XmlMediaTypeFormatter());
    config.Formatters.XmlFormatter.UseXmlSerializer = true;
}

然后在我想用XML回复的webapi中

public HttpResponseMessage GetCollections(int Id)
{
    List<CollectionDTO> result = _collectionsLogic.GetCollections(Id);

    IContentNegotiator negotiator = this.Configuration.Services.GetContentNegotiator();

    ContentNegotiationResult resultFormatted = negotiator.Negotiate(
            typeof(List<CollectionDTO>), this.Request, this.Configuration.Formatters);

    if (result == null)
    {
        var response = new HttpResponseMessage(HttpStatusCode.NotAcceptable);
        throw new HttpResponseException(response);
    }

    return new HttpResponseMessage()
    {
        Content = new ObjectContent<List<CollectionDTO>>(
                      result,
                      resultFormatted.Formatter,
                      resultFormatted.MediaType.MediaType
        )};
    }
}

例如,如果我用Postman调用此webapi,并在标头中插入Accept等于application/xml的标题,则将以XML格式接收结果,否则以json