【问题标题】:Switching ASP.Net Web API returns between XML and JSON; where's it done?在 XML 和 JSON 之间切换 ASP.Net Web API 返回;在哪里做的?
【发布时间】:2014-05-08 00:48:48
【问题描述】:

我有一个ASP.Net Web API 项目。在我的控制器中是这个简单的“样板”API 方法:

using System.Web.Http;
public class DataController : ApiController
{
    private static Random _Random = new Random();

    [Route("api/getrandomdoubles/{count:int}")]
    [AcceptVerbs("GET", "POST")]
    public double[] GetRandomDoubles(int count)
    {
        var doubles = new double[count];
        for (var i = 0; i < count; i++)
        {
            doubles[i] = _Random.NextDouble();
        }
        return doubles;
    }
}

(请注意,我已经删除了其他方法。)

如果我在浏览器中这样调用 http://localhost:1165/api/GetRandomDoubles/2 我会返回 XML:

<ArrayOfdouble xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <double>0.3777879822895806</double>
    <double>0.46401416811347668</double>
</ArrayOfdouble>

如果我这样从 JavaScript 调用它:

d3.json('api/getrandomdoubles/2', function (error, data) {
    //Do stuff
});

我返回 JSON [0.6679551008473873,0.9205140638726363]

什么决定了我的控制器 API 方法何时返回 XML 以及何时返回 JSON?我猜它是根据 HTTP 动词决定的,即 PUTGET 但我看不出它是在哪里指定的。我将如何自己控制返回类型?

========== 编辑 ==========

我刚刚意识到这是特定于浏览器的。在IE中调用http://localhost:1165/api/GetRandomDoubles/2返回JSON,在Chrome中调用返回XML。

【问题讨论】:

    标签: asp.net-web-api asp.net-web-api-routing


    【解决方案1】:

    在 Web API 中称为Content Negotiation

    首先,管道从 HttpConfiguration 对象获取 IContentNegotiator 服务。它还从 HttpConfiguration.Formatters 集合中获取媒体格式化程序列表。

    接下来,管道调用 IContentNegotiatior.Negotiate,传入:

    1. 要序列化的对象类型
    2. 媒体格式化程序集合
    3. HTTP 请求

    Negotiate 方法返回两条信息:

    1. 使用哪种格式化程序
    2. 响应的媒体类型

    如果没有找到格式化程序,则 Negotiate 方法返回 null,并且客户端收到 HTTP 错误 406(不可接受)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-14
      • 2013-08-18
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多