如何使用 Chrome 让 Web API ASP.NET 返回 JSON 而不是 XML?

How do I get ASP.NET Web API to return JSON instead of XML using Chrome?

提问人:naspinski 提问时间:3/24/2012 最后编辑:DanielVnaspinski 更新时间:4/9/2022 访问量:974912

问:

这个问题的答案是社区的努力。编辑现有答案以改进此帖子。它目前不接受新的答案或互动。

使用较新的 ASP.NET Web API,在 Chrome 中我看到 XML - 如何将其更改为请求 JSON,以便我可以在浏览器中查看它?我确实相信这只是请求标头的一部分,我这样做正确吗?

json google-chrome asp.net-web-api

评论

8赞 Natan 1/7/2015
这里有一个讨论,使返回JSON仅是默认行为:github.com/aspnet/Mvc/issues/1765

答:

54赞 Aaron Daniels 3/24/2012 #1

查看 WebAPI 中的内容协商。这些(第 1 部分第 2 部分)非常详细和透彻的博客文章解释了它是如何工作的。

简而言之,你是对的,只需要设置 or 请求标头。假设您的 Action 未编码为返回特定格式,您可以设置 .AcceptContent-TypeAccept: application/json

评论

6赞 Spongman 3/6/2013
“这样我就可以在浏览器中查看它”
1赞 Ivaylo Slavov 4/26/2014
@Spongman,是的,你可以。但是使用像REST客户端这样的扩展 - 大多数浏览器都有类似的扩展。在浏览器中直接输入 url 是 1。限制性太强(无法控制标题,无法发布数据等);2. 不正确 - 浏览器没有按照预期使用的方式使用 Web API,您不能依赖它来正确测试它。因此,一个好的REST客户端插件可以解决这个问题。
35赞 suhair 3/27/2012 #2

一个快速选项是使用 MediaTypeMapping 专用化。下面是在 Application_Start 事件中使用 QueryStringMapping 的示例:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("a", "b", "application/json"));

现在,在这种情况下,每当 url 包含查询字符串 ?a=b 时,Json 响应就会显示在浏览器中。

评论

2赞 marknuzz 4/14/2012
这非常有用。如果要使用 path.to/item.json,还可以使用 UriPathExtensionMapping 而不是 QueryStringMapping
10赞 Mike Rowley 3/29/2012 #3

我发现 Chrome 应用程序“高级 REST 客户端”非常适合与 REST 服务一起使用。您可以将 Content-Type 设置为以下项: 高级 REST 客户端application/json

192赞 Yakir Manor 4/3/2012 #4

MVC4 快速提示 #3 – 从 Web API 中删除 XML 格式化程序 ASP.Net

在添加行中:Global.asax

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

这样:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    BundleTable.Bundles.RegisterTemplateBundles();
    GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
}

评论

9赞 whitneyland 4/16/2012
工作 - 将 JSON 作为默认值而不是 XML 要好得多。
5赞 Thomas Stock 7/4/2012
但是你还能返回XML吗?
101赞 Thomas Stock 7/4/2012
我测试过,你不能。所以这是删除XML支持。你们被警告了,亲爱的谷歌人
3赞 Glenn Slaven 9/24/2012
如果你看看我在下面的回答,如果你愿意,这仍然会让xml被返回,但让网站用JSON响应浏览器
3赞 radu florescu 10/15/2012
@GlennSlaven是的,您的答案应该是标记为正确的答案。
101赞 Diganta Kumar 7/6/2012 #5

Global.asax 中,我使用以下代码。我获取 JSON 的 URI 是http://www.digantakumar.com/api/values?json=true

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new  QueryStringMapping("json", "true", "application/json"));
}

评论

2赞 LT.Nolo 9/5/2012
很棒的一个。你期望参数的方法是什么?像 localhost:61044/api/values/getdate?json=true,date=2012-08-01
22赞 dmyoko 7/15/2012 #6

不要使用浏览器来测试 API。

相反,请尝试使用允许您指定请求的 HTTP 客户端,例如 CURL 甚至 Fiddler。

此问题出在客户端中,而不是 API 中。Web API 根据浏览器的请求正常运行。

评论

33赞 Anders Lindén 9/18/2012
为什么不使用浏览器?这是一个显而易见的工具。
5赞 Ivaylo Slavov 4/26/2014
我认为这里的观点是正确且重要的 - 如果问题是由客户端引起的,我们不应该过度修复应用程序的工作部分(MVC WebAPI 基础结构)。Api 的真正用例是正确使用(通过提供正确的标头),这是应用程序的责任。不过,我不同意完全放弃浏览器 - 对于测试,几乎任何浏览器都有很多工具(首先是类似 Rest Client 的扩展)。
8赞 bonh 5/15/2015
这可能应该是一个评论。
523赞 Glenn Slaven 9/19/2012 #7

如果在 中执行此操作,默认情况下将获得 JSON,但如果您作为请求标头传递,它仍然允许您返回 XML。WebApiConfigtext/xmlAccept

注意:这将删除对application/xml

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
    }
}

如果您没有使用 MVC 项目类型,因此一开始就没有此类,请参阅此答案,了解有关如何合并它的详细信息。

评论

52赞 porges 3/27/2013
请注意,原始行为是正确的。优先级为 0.9 且优先级为 0.8 的 Chrome 请求。通过删除,您可以删除 Web API 在客户端特定请求时返回 XML 的功能。例如,如果您发送“Accept: application/xml”,您仍将收到 JSON。application/xml*/*application/xml
12赞 NickG 4/10/2013
是我,还是第一句话不正确?该代码似乎完全删除了 XML,而不是简单地更改默认值。
6赞 Cohen 7/3/2013
@NickG:这里忽略了一个解决方案,恕我直言,这是一个更好的选择(保留应用程序/xml)是 Felipe Leusin 在此页面下方提出的解决方案。使用 config.Formatters.XmlFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue(“text/html”));
1赞 Kyle 9/3/2013
那么,我们如何通过 Web 配置来做到这一点,以便我们默认获得 json 并在请求时获得 XML?
4赞 Ken Smith 9/9/2013
@Felipse Leusin 下面的答案实际上更短,效果更好。
1832赞 Felipe Leusin 11/8/2012 #8

注意:阅读此答案的评论,如果您使用 WebAPI 的默认错误处理,它可能会产生 XSS 漏洞

我只是在我的 MVC Web API 项目的类中添加以下内容。App_Start / WebApiConfig.cs

config.Formatters.JsonFormatter.SupportedMediaTypes
    .Add(new MediaTypeHeaderValue("text/html") );

这样可以确保在大多数查询上获得 JSON,但可以在发送 .XMLtext/xml

如果您需要回复,请查看下面的 Todd 答案Content-Typeapplication/json

NameSpace正在使用 。System.Net.Http.Headers

评论

120赞 gregmac 1/15/2013
这是一个令人惊讶的被忽视的答案,尽管最初的问题并不完全清楚,但这直接使 JSON 成为 Web 浏览器的默认响应(发送 Accept: text/html)。干得好。
17赞 Derek Hunziker 11/16/2013
+1 远非最佳答案。我想有很多人选择完全删除 XML,只是因为他们在浏览器中看不到 JSON。
4赞 Stonetip 3/14/2014
当我这样做时,我发现第三方提供的数据中带有 HTML 中断标签,最终带有回车符。然后 JSON 无效。如果这对您有影响,最好使用公认的答案。
25赞 Mrchief 5/3/2014
请注意,响应的标头仍将是 。Content-Typetext/html
84赞 Northstrider 7/11/2014
这太可怕了。响应内容类型标头应为 application/json。这个“解决方案”使它成为文本/html。
121赞 Michael Vashchinsky 1/6/2013 #9

WebApiConfig.cs 中,添加到 Register 函数的末尾:

// Remove the XML formatter
config.Formatters.Remove(config.Formatters.XmlFormatter);

来源

评论

1赞 Steven 9/19/2013
在 MVC5 中,这可以通过将 config 替换为 GlobalConfiguration.Configuration 来完成
5赞 Luc C 7/15/2014
对于必须仅支持 JSON 且在任何情况下都不允许发出 XML 的项目,这是迄今为止最好的选择。
1赞 Cas Bloem 4/16/2015
配置。Formatters.Add(config.Formatters.JsonFormatter);
3赞 BrainSlugs83 5/6/2017
这太可怕了。-- 无论如何,这将始终返回 JSON,即使客户端在 Content-Type 标头中明确要求 XML。
2赞 cdiggins 11/5/2020
对 API 的 XML 版本没有像其 JSON 版本那样彻底测试的项目应该选择它。根据 Michael 包含的链接,不同的格式化程序以不同的方式序列化对象。例如:XML 格式化程序不会序列化只读字段,而 JSON 格式化程序会序列化。
11赞 Roger Lipscombe 6/23/2013 #10

当标题包含“Chrome”时,我使用全局操作过滤器来删除:Accept: application/xmlUser-Agent

internal class RemoveXmlForGoogleChromeFilter : IActionFilter
{
    public bool AllowMultiple
    {
        get { return false; }
    }

    public async Task<HttpResponseMessage> ExecuteActionFilterAsync(
        HttpActionContext actionContext,
        CancellationToken cancellationToken,
        Func<Task<HttpResponseMessage>> continuation)
    {
        var userAgent = actionContext.Request.Headers.UserAgent.ToString();
        if (userAgent.Contains("Chrome"))
        {
            var acceptHeaders = actionContext.Request.Headers.Accept;
            var header =
                acceptHeaders.SingleOrDefault(
                    x => x.MediaType.Contains("application/xml"));
            acceptHeaders.Remove(header);
        }

        return await continuation();
    }
}

似乎有效。

37赞 jayson.centeno 9/3/2013 #11

这段代码使 json 成为我的默认代码,并允许我使用 XML 格式。我只附加 .xml=true

GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("xml", "true", "application/xml"));
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

谢谢大家!

评论

1赞 raider33 3/30/2014
这是最灵活的答案(现在确实应该是默认配置)。为了补充这个答案,JSON 是默认的,包括来自浏览器的 JSON。若要查看 XML,请添加查询字符串:?xml=true
0赞 pat capozzi 6/18/2015
尝试了多种策略。对 XML 和 JSON 进行了简单的测试,这是开箱即用的
45赞 Chris S 9/27/2013 #12

由于该问题是特定于 Chrome 的,因此您可以获取 Postman 扩展程序,该扩展程序允许您设置请求内容类型。

Postman

评论

0赞 Bjartur Thorlacius 6/6/2018
在 Firefox 中,只需转到 about:config,搜索 accept.default 并将配置内容更改为 .network.http.accept.defaulttext/html,application/xhtml+xml,application/json;q=0.9,application/xml;q=0.8,*/*;q=0.7
0赞 Bjartur Thorlacius 6/6/2018
或者更好的是,只是为了避免像 Bitbucket 这样的有问题的主机意外地提供您的浏览器 JSON 来代替 HTML。text/html,application/xhtml+xml;q=1.0,*/*;q=0.7
0赞 Falcon Momot 7/2/2018
URL 已失效。一个新的是 chrome.google.com/webstore/detail/postman/...
329赞 Todd Menier 12/13/2013 #13

我最喜欢 Felipe Leusin 的方法 - 确保浏览器获得 JSON,而不会影响实际需要 XML 的客户端的内容协商。对我来说,唯一缺少的部分是响应标头仍然包含 content-type:text/html。为什么会有问题?因为我使用的是 JSON 格式化程序 Chrome 扩展程序,它会检查内容类型,而且我没有得到我习惯的漂亮格式。我用一个简单的自定义格式化程序修复了这个问题,该格式化程序接受文本/html 请求并返回 application/json 响应:

public class BrowserJsonFormatter : JsonMediaTypeFormatter
{
    public BrowserJsonFormatter() {
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        this.SerializerSettings.Formatting = Formatting.Indented;
    }

    public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType) {
        base.SetDefaultContentHeaders(type, headers, mediaType);
        headers.ContentType = new MediaTypeHeaderValue("application/json");
    }
}

像这样注册:

config.Formatters.Add(new BrowserJsonFormatter());

评论

24赞 Alastair Maw 5/15/2014
在构造函数中,如果您希望它打印得漂亮,而无需浏览器扩展,请添加。this.SerializerSettings.Formatting = Formatting.Indented;
11赞 Northstrider 7/11/2014
你为什么希望它在网上打印得很漂亮?
9赞 H.Wolper 12/1/2014
@dmit77的答案不是比这个更好(更简洁)吗?
9赞 Northstrider 2/13/2015
@eddiegroves你不希望在电线上印上漂亮的印刷品。您希望服务器通过网络发送最少的位数(即:无空格)。然后你希望浏览器很好地格式化它,包括插件等。Javascript 通常需要解析 JSON,为什么要通过引入不必要的格式来使其变慢
15赞 Berriel 9/16/2015
对于正在寻找的谷歌员工:不要忘记添加和using System.Net.Http.Formattingusing Newtonsoft.Json
350赞 dmit77 9/27/2014 #14

使用 RequestHeaderMapping 效果更好,因为它还可以设置响应标头,这允许 Firefox(带有 JSONView 插件)将响应格式化为 JSON。Content-Type = application/json

GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings
.Add(new System.Net.Http.Formatting.RequestHeaderMapping("Accept", 
                              "text/html",
                              StringComparison.InvariantCultureIgnoreCase,
                              true, 
                              "application/json"));

评论

8赞 Steve Johnson 3/8/2015
这是最精简、最简单的解决方案,Fiddler 还会检测以 josn 形式返回的内容类型。
5赞 Tim Abell 5/22/2015
好!你建议把它放在代码的什么地方?
12赞 Animesh 6/25/2015
它应该进入 WebApiConfig.cs
9赞 bbsimonbb 2/9/2016
为我工作。我需要添加一个 using System.Net.Http.Formatting;
2赞 Phileosophos 9/14/2017
需要明确的是,这只是更改了默认值。您始终可以通过包含相关的“Accept”标头来获取 JSON 或 XML。
2赞 lko 10/1/2014 #15

来自 MSDN 使用 ASP.NET 和 AngularJS 构建单页应用程序(约 41 分钟)。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // ... possible routing etc.

        // Setup to return json and camelcase it!
        var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
        formatter.SerializerSettings.ContractResolver =
            new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
    }

它应该是最新的,我试过了,它奏效了。

7赞 Nick 10/10/2015 #16

我不清楚为什么答案会有所有这些复杂性。当然,有很多方法可以做到这一点,包括 QueryStrings、标头和选项......但我认为最好的做法很简单。你请求一个纯 URL(例如:),作为回报,你会得到 JSON。您将获得具有正确响应标头的 JSON:http://yourstartup.com/api/cars

Content-Type: application/json

在寻找同一个问题的答案时,我找到了这个线程,并且不得不继续前进,因为这个公认的答案并不完全有效。我确实找到了一个答案,我觉得这个答案太简单了,不能成为最好的答案:

设置默认的 WebAPI 格式化程序

我也会在这里添加我的提示。

WebApiConfig.cs

namespace com.yourstartup
{
  using ...;
  using System.Net.Http.Formatting;
  ...
  config.Formatters.Clear(); //because there are defaults of XML..
  config.Formatters.Add(new JsonMediaTypeFormatter());
}

我确实有一个默认值(至少我看到的默认值)来自哪里的问题。它们是 .NET 默认值,还是可能在其他地方创建(由我的项目中的其他人创建)。安利,希望这会有所帮助。

3赞 rism 12/6/2015 #17

自提出(并回答)此问题以来已经过去了一段时间,但另一种选择是在请求处理期间使用 MessageHandler 覆盖服务器上的 Accept 标头,如下所示:

public class ForceableContentTypeDelegationHandler : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(
                HttpRequestMessage request,
                CancellationToken cancellationToken)
    {
        var someOtherCondition = false;
        var accHeader = request.Headers.GetValues("Accept").FirstOrDefault();
        if (someOtherCondition && accHeader.Contains("application/xml"))
        {
            request.Headers.Remove("Accept");
            request.Headers.Add("Accept", "application/json");
        }
        return await base.SendAsync(request, cancellationToken);
    }
}

哪里可以是任何东西,包括浏览器类型等。这将适用于条件情况,在这种情况下,我们只希望有时覆盖默认内容协商。否则,根据其他答案,您只需从配置中删除不必要的格式化程序即可。someOtherCondition

当然,您需要注册它。您可以全局执行此操作:

  public static void Register(HttpConfiguration config) {
      config.MessageHandlers.Add(new ForceableContentTypeDelegationHandler());
  }

或逐条路线:

config.Routes.MapHttpRoute(
   name: "SpecialContentRoute",
   routeTemplate: "api/someUrlThatNeedsSpecialTreatment/{id}",
   defaults: new { controller = "SpecialTreatment" id = RouteParameter.Optional },
   constraints: null,
   handler: new ForceableContentTypeDelegationHandler()
);

由于这是一个消息处理程序,它将在管道的请求端和响应端运行,就像 .因此,您可以使用自定义标头轻松确认覆盖:HttpModule

public class ForceableContentTypeDelegationHandler : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(
                HttpRequestMessage request,
                CancellationToken cancellationToken)
    {
        var wasForced = false;
        var someOtherCondition = false;
        var accHeader = request.Headers.GetValues("Accept").FirstOrDefault();
        if (someOtherCondition && accHeader.Contains("application/xml"))
        {
            request.Headers.Remove("Accept");
            request.Headers.Add("Accept", "application/json");
            wasForced = true;
        }

        var response =  await base.SendAsync(request, cancellationToken);
        if (wasForced){
          response.Headers.Add("X-ForcedContent", "We overrode your content prefs, sorry");
        }
        return response;
    }
}
6赞 mdisibio 1/13/2016 #18

这是一个类似于 jayson.centeno 和其他答案的解决方案,但使用来自 的内置扩展。System.Net.Http.Formatting

public static void Register(HttpConfiguration config)
{
    // add support for the 'format' query param
    // cref: http://blogs.msdn.com/b/hongyes/archive/2012/09/02/support-format-in-asp-net-web-api.aspx
    config.Formatters.JsonFormatter.AddQueryStringMapping("$format", "json", "application/json");
    config.Formatters.XmlFormatter.AddQueryStringMapping("$format", "xml", "application/xml");

    // ... additional configuration
 }

该解决方案主要面向在早期版本的 WebApi 中支持 OData 的$format,但它也适用于非 OData 实现,并在响应中返回标头。Content-Type: application/json; charset=utf-8

它允许您在使用浏览器进行测试时标记或到 uri 的末尾。在使用非浏览器客户端时,它不会干扰其他预期行为,您可以在其中设置自己的标头。&$format=json&$format=xml

4赞 vaheeds 2/8/2016 #19

你只需像这样改变:App_Start/WebApiConfig.cs

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();
        //Below formatter is used for returning the Json result.
        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
        //Default route
        config.Routes.MapHttpRoute(
           name: "ApiControllerOnly",
           routeTemplate: "api/{controller}"
       );
    }

评论

0赞 naspinski 2/8/2016
删除格式化程序通常不是一个好主意,您正在删除功能。
0赞 vaheeds 2/9/2016
实际上在这种情况下,它对我来说效果很好,许多其他人也提出了这样的方法。我从 myview.rahulnivi.net/building-spa-angular-mvc-5 书中学到了!
3赞 Vikas Bansal 5/28/2016 #20

这是我在应用程序中使用的最简单的方法。在函数中添加以下给定的 3 行代码:App_Start\WebApiConfig.csRegister

var formatters = GlobalConfiguration.Configuration.Formatters;

formatters.Remove(formatters.XmlFormatter);

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));

Asp.net Web API 会自动将返回对象序列化为 JSON,并在标头中添加 时,以便浏览器或接收方了解您正在返回 JSON 结果。application/json

2赞 rocky_pps 9/25/2016 #21

WebApiConfig 是可以配置是要以 json 格式输出还是以 xml 格式输出的位置。默认情况下,它是 xml。在 register 函数中,我们可以使用 HttpConfiguration 格式化程序来格式化输出。

System.Net.Http.Headers => MediaTypeHeaderValue("text/html")需要获取 JSON 格式的输出。

enter image description here

14赞 A.T. 10/27/2016 #22

在最新版本的 ASP.net WebApi 2 中,在 下,这将起作用:WebApiConfig.cs

config.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
config.Formatters.Add(GlobalConfiguration.Configuration.Formatters.JsonFormatter);
6赞 Md. Sabbir Ahamed 11/10/2016 #23

只需在 WebApiConfig 类上添加这两行代码即可

public static class WebApiConfig
{
     public static void Register(HttpConfiguration config)
     {
          //add this two line 
          config.Formatters.Clear();
          config.Formatters.Add(new JsonMediaTypeFormatter());


          ............................
      }
}
15赞 Stacked 12/9/2016 #24

返回正确的格式由媒体类型格式化程序完成。 正如其他人所提到的,你可以在课堂上这样做:WebApiConfig

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ...

        // Configure Web API to return JSON
        config.Formatters.JsonFormatter
        .SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));

        ...
    }
}

有关更多信息,请查看:

如果您的操作返回 XML(默认情况下是这种情况),并且您只需要一个特定的方法来返回 JSON,则可以使用 并将其应用于该特定操作。ActionFilterAttribute

筛选器属性:

public class JsonOutputAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        ObjectContent content = actionExecutedContext.Response.Content as ObjectContent;
        var value = content.Value;
        Type targetType = actionExecutedContext.Response.Content.GetType().GetGenericArguments()[0];

        var httpResponseMsg = new HttpResponseMessage
        {
            StatusCode = HttpStatusCode.OK,
            RequestMessage = actionExecutedContext.Request,
            Content = new ObjectContent(targetType, value, new JsonMediaTypeFormatter(), (string)null)
        };

        actionExecutedContext.Response = httpResponseMsg;
        base.OnActionExecuted(actionExecutedContext);
    }
}

应用于操作:

[JsonOutput]
public IEnumerable<Person> GetPersons()
{
    return _repository.AllPersons(); // the returned output will be in JSON
}

请注意,您可以省略动作装饰上的单词,并使用 just 代替 .Attribute[JsonOutput][JsonOutputAttribute]

评论

0赞 dLcreations 1/28/2022
完美的解释
20赞 pavan kumar 4/13/2017 #25

上面的大多数答案都非常有道理。 由于您看到的数据以 XML 格式格式化,这意味着应用了 XML 格式化程序,因此您只需从 HttpConfiguration 参数中删除 XMLFormatter 即可查看 JSON 格式,例如

public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );                
            config.Formatters.Remove(config.Formatters.XmlFormatter);                
            config.EnableSystemDiagnosticsTracing();
        }

因为JSON是默认格式

10赞 Gaurav Dubey 7/1/2017 #26
config.Formatters.Remove(config.Formatters.XmlFormatter);

评论

3赞 S.R 7/1/2017
虽然此代码可以回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高答案的长期价值。请阅读此 stackoverflow.com/help/how-to-answer
-3赞 user3285954 12/1/2017 #27

我很惊讶地看到这么多回复需要编码来更改一个 API 中的单个用例 (GET),而不是使用适当的工具,这些工具必须安装一次,并且可用于任何 API(自己的或第三方)和所有用例。

所以好的答案是:

  1. 如果只想请求 json 或其他内容类型,请安装 Requestly 或类似工具,并修改 Accept 标头。
  2. 如果您也想使用 POST 并且格式良好的 json、xml 等,请使用适当的 API 测试扩展,例如 PostmanARC

评论

0赞 tno2007 2/25/2020
有些人喜欢在不增加额外工具和库形式的臃肿的情况下做事。
0赞 user3285954 2/25/2020
仅仅因为有人使用了错误的工具来完成工作而对 API 进行更改仍然是错误的。Web 浏览器不是用来测试 API 的,甚至不是用来查看 API 的输出,而是用来查看文档的。如果有人认为 API 测试工具是臃肿的,而不是任何 API 开发人员的强制性工具包的一部分,那就更糟了,老实说,我也会添加前端开发人员,因为他们也需要与 API 进行交互和实验。这可能还不够,因为没有插件的浏览器不允许设置标头、发布到 API 甚至检查响应标头。
0赞 tno2007 2/25/2020
我明白你在说什么,你没有错。但只是题外话,你被否决的原因是你回答问题的语气。你听起来很有战斗力,给人的印象是那种认为自己无所不知的开发人员,这是非常令人反感的。从你的回答来看,我确信你是一个伟大的开发人员。但是,你必须学会,尤其是在这样的专业 QA 环境中,以更友好、更人性化的方式与人们交谈和说服。也许,首先给出他们想要的答案,然后解释一个更好的方法,并激励为什么它更好。
7赞 Akshay Kapoor 4/11/2018 #28

您可以按如下方式使用:

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());

评论

0赞 allen1 1/1/2019
如果你正在制作一个仅用于传递 JSON 消息的 WebAPI 应用,请考虑以下答案。
2赞 Charles Burns 4/14/2018 #29

多年来,在最近更新了核心库和 Json.Net 库后,我使用了 Felipe Leusin 的答案,遇到了 :SupportedMediaTypes。 就我而言,解决方案是安装 .在某些情况下,NuGet 显然会删除它。手动安装后,问题已解决。System.MissingMethodExceptionSystem.Net.Http