ASP.NET MVC 4 Web API 学习 正确返回JSON数据方法

web api 本来就可以返回json格式的,为什么我们要还对它做一些修改呢?

因为web api默认返回的是xml,在提交请求的是设置了 Content-Type: application/json;

返回的才是JSON格式的数据!

 但是怎么做到让它只是返回JSON格式的数据呢?

有时候就会遇到这种需求!

 这是我最开始的做法]
public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            var json = config.Formatters.JsonFormatter;
            json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
            config.Formatters.Remove(config.Formatters.XmlFormatter);
}
 

可以返回JSON格式了,但是莫名其妙的多出了个$id 不懂哪里来的!

 

最后正确的办法是使用自定义的只返回Json Result的content negotiation代替Web Api中默认的content negotiation。 Conneg通过实现IContentNegotiator的Negotiator方法实现扩展。Negotiator方法返回ContentNegotiationResult(它包装了你选择的headers和formatter)。下面的方法通过传递一个JsonMediaTypeFormatter给自定义的conneg negotiator,让它一直返回applicaton/json 的content-type以及JsonMediaTypeFormatter。这种方法避免了每次请求都要重新创建一次formatter。

public class JsonContentNegotiator : IContentNegotiator
{
    private readonly JsonMediaTypeFormatter _jsonFormatter;

    public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
    {
        _jsonFormatter = formatter;   
    }

    public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
    {
        var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
        return result;
    }
}
 

接下来,你需要在HttpConfiguration实例上注册你的新的实现机制:

var jsonFormatter = new JsonMediaTypeFormatter();
//optional: set serializer settings here
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
 

通过替换默认的DefaultContentNegotiator,我们使用我们自定义的JsonContentNegotiator,它只支持Json,而且可以马上返回。

如果你想更深入的了解Content Negotiation的知识,你可以查看作者的这篇文章。

总结

通过使用自定义的JsonContentNegotiator替换系统默认的DefaultContentNegotiator,很好的实现Web Api只返回Json的功能,而且没有额外的开销。

时间: 2024-10-26 08:15:46

ASP.NET MVC 4 Web API 学习 正确返回JSON数据方法的相关文章

[Angularjs]asp.net mvc+angularjs+web api单页应用

写在前面 最近的工作一直在弄一些h5的单页应用,然后嵌入到app的webview中.之前一直在用angularjs+html+ashx的一套东西.实在是玩腻了.然后就尝试通过asp.net mvc的方式构建单页应用.用到的技术angularjs+webapi+mvc.在网上找到了一些相关的文章,关于anguar的位置也没有一个比较好的一个标准.这里也是抛砖引玉,希望通过讨论,得到一个更好的结构. 项目结构 结构说明: _Layout.cshtml:该文件作为模板文件,这里将应用的js,及css文

asp.net 的前台用$.ajax调用ashx返回json数据问题

问题描述 asp.net的前台用$.ajax调用ashx返回,如果把ajax的dataType改为'"text",alert(msg)显示{"id":"111","c1":"aa","c2":"bb"},dataType改为"json",alert(msg)不显示,alert(msg[0])显示{.用varobj=eval("("

[Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作

写在前面 前篇文章整理了angularjs学习目录,有园子里的朋友问我要这方面的demo,周末也没什么事,就在之前的单页应用的demo上面添加了增删改查的操作.代码比较简单,这里只列举比较重要的代码片段.完整的代码将在文章下面提供链接. demo 数据来源通过webapi的方式提供.获取对产品的查询,分页,增加商品,删除,修改等操作. webapi using Newtonsoft.Json; using System; using System.Collections.Generic; usi

ASP.NET MVC Web API 学习笔记---联系人增删改查

本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系人          说明:为了方便数据不使用真正的数据库,而是通过内存数据模拟    1.       Web API中包含的方法 Action HTTP method Relative URI GetAllContact GET /api/contact GetContact GET /api/

ASP.NET MVC Web API 学习笔记----HttpClient简介

  1. HttpClient简单介绍  依稀还记得那个时候用WebClient,HttpWebRequest来发送一个请求,现在ASP.NET MVC4中自带了一个类HttpClient,用于接收HttpResponseMessage和发送HttpRequestMesssage. 问题在于既然WebClient,HttpWebRequest可以完成相应的功能,为什么还要使用HttpClient类,.NET Framework中既然提出了这样一个类肯定是有其特别之处的,这里罗列几个不同之处: (

asp.net web api 接收不到post数据问题

问题描述 asp.net web api 接收不到post数据问题 接口文档: 我自己写的代码: public class Input { public string Appkey { get; set; } public string Sno { get; set; } public string[] Clist { get; set; } } public class Rback { public string Code { get; set; } public string Msg { g

《Pro ASP.NET MVC 3 Framework》学习笔记之二十四【Controllers和Actions】

重定向到文本URL(Redirecting to a Literal URL) 最基本的重定向浏览器方式就是调用Redirect方法,该方法会返回一个RedirectResult类的实例. 例如:public RedirectResult Redirect() {return RedirectPermanent("/Example/Index"); }当然我们可以根据自己的喜好来选择Redirect方法的重载,可以添加一个bool类型的参数指定是否永久重定向(不指定则是暂时重定向) 进

《Pro ASP.NET MVC 3 Framework》学习笔记目录

<Pro ASP.NET MVC 3 Framework>简介: 作者: Adam Freeman 和 Steven Sanderson 出版社: Apress; New 平装: 820页 语种: 英语 ISBN: 1430234040 声明:笔记里面按我自己的理解翻译了大部分内容,写这个笔记的目的:为了方便自己查阅,也为园友提供学习的方便. 我无意侵犯作者的任何权利,仅仅为了自己学习.也希望路过的朋友不要用于任何商业目的. 第一部分 ASP.NET MVC3介绍   <Pro ASP.

《Pro ASP.NET MVC 3 Framework》学习笔记之三十二 【无入侵的Ajax】

Ajax是Asynchronous JavaScript and XML的缩写,正如我们看到的,XML部分已经不再像过去那样重要,但是异步的部分却让Ajax非常有用.它是一种在后台从服务端请求数据的模型,而不用重新加载网页. 使用MVC无入侵的Ajax(Using MVC Unobtrusive Ajax) MVC框架包含了对无入侵的Ajax的支持,而且是基于jQuery库的.下面创建示例项目UnobtrusiveAjax,如下: View Code //model using System.C