使用Jil序列化JSON提升Asp.net web api 性能

 

JSON序列化无疑是Asp.net web api 里面性能提升最重要的一环。

在Asp.net web api 里面我们可以插入自定义的MediaTypeFormatter(媒体格式化器),

说白了就是根据HTTP content-type application/json

来判断采用哪种媒体格式化器

具体实现,记得要引入Jil包


  public class JilFormatter : MediaTypeFormatter
{
private readonly Options _jilOptions;
private MethodInfo _method; public JilFormatter()
{
//要序列化的时间格式
_jilOptions = new Options(dateFormat: DateTimeFormat.ISO8601);
//媒体类型
SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
//加入 UTF8Encoding 编码
SupportedEncodings.Add(new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true));
//加入 UnicodeEncoding 编码
SupportedEncodings.Add(new UnicodeEncoding(bigEndian: false, byteOrderMark: true, throwOnInvalidBytes: true)); }
//判断是否反序列化类型
public override bool CanReadType(Type type)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
return true;
}
//判断是否序列化类型
public override bool CanWriteType(Type type)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
return true;
} // 异步反序列化一个指定类型的对象。
public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, System.Net.Http.HttpContent content, IFormatterLogger formatterLogger)
{
return Task.FromResult(DeserializeFromStream(type, readStream));
} private object DeserializeFromStream(Type type, Stream readStream)
{
try
{
using (var reader = new StreamReader(readStream))
{
return JSON.Deserialize(reader, type, _jilOptions);
}
}
catch
{
return null;
}
} // 异步序列化一个指定类型的对象。
public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, System.Net.Http.HttpContent content, TransportContext transportContext)
{
var streamWriter = new StreamWriter(writeStream);
JSON.Serialize(value, streamWriter, _jilOptions);
streamWriter.Flush();
return Task.FromResult(writeStream);
}
}

加入到媒体格式化器集合中

 public static void Register(HttpConfiguration config)
{
// Web API 配置和服务 // Web API 路由
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional } );
GlobalConfiguration.Configuration.Formatters[0] = new JilFormatter();
}
}

控制类

  public class HomeController : ApiController
{
public static List<Market> Markets = new List<Market>(); public HomeController()
{ } static HomeController()
{
Markets.Add(new Market { Id = 1, Name = "1", DateTimeNow = DateTime.Now });
Markets.Add(new Market { Id = 2, Name = "1", DateTimeNow = DateTime.Now });
Markets.Add(new Market { Id = 3, Name = "1", DateTimeNow = DateTime.Now });
Markets.Add(new Market { Id = 4, Name = "1", DateTimeNow = DateTime.Now });
Markets.Add(new Market { Id = 5, Name = "1", DateTimeNow = DateTime.Now });
}
public IEnumerable<Market> Get()
{
return Markets;
}
public HttpResponseMessage Post([FromBody]Market value)
{
Markets.Add(value);
return new HttpResponseMessage(HttpStatusCode.OK);
} public HttpResponseMessage Put(int id, [FromBody]Market value)
{
var market = Markets.Where(x => x.Id == id).FirstOrDefault();
if (market == null)
return new HttpResponseMessage(HttpStatusCode.NotFound); market.Name = value.Name;
return new HttpResponseMessage(HttpStatusCode.OK);
} public HttpResponseMessage Delete(int id)
{
var result = Markets.Remove(Markets.Where(x => x.Id == id).FirstOrDefault());
return result
? new HttpResponseMessage(HttpStatusCode.Accepted)
: new HttpResponseMessage(HttpStatusCode.NotFound);
}
}

我们通过postman访问

我们在post一个实体

我们在get一下

已经可以看见刚才post的实体了。

源码:http://pan.baidu.com/s/1i3o6KD3

Asp.net Mvc vnext 系列  http://www.cnblogs.com/liek/p/4634294.html

得到你的肯定是我最大的动力!

 
分类: Asp.net vnext

Jil序列化JSON的更多相关文章

  1. 使用Jil序列化JSON提升Asp.net web api 性能

    JSON序列化无疑是Asp.net web api 里面性能提升最重要的一环. 在Asp.net web api 里面我们可以插入自定义的MediaTypeFormatter(媒体格式化器), 说白了 ...

  2. .NET序列化工具Jil、Json.NET和Protobuf的简单测评

    前一段时间逛园子的时候发现有人比较了Jil.Json.NET和Protobuf的性能,一时好奇,也做了个测试,这里记录下来,以供查阅. 前期准备 依赖类库的话,可以通过Nuget在公共组件库总下载,这 ...

  3. JavaScriptSerializer 序列化json 时间格式

    利用JavaScriptSerializer 序列化json 时间格式,得到的DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,显然要进行转换 1.利用字符串直 ...

  4. 使用 ServiceStack.Text 序列化 json的实现代码【转】

    转自:http://www.jb51.net/article/38338.htm 今天发篇文章总结下自己使用 ServiceStack.Text 来序列化 json.它的速度比 Newtonsoft. ...

  5. 使用 ServiceStack.Text 序列化 json 比Json.net更快

    本节将介绍如何使用ServiceStack.Text 来完成高性能序列化和反序列化操作. 在上章构建高性能ASP.NET应用的几点建议 中提到使用高性能类库,有关于JSON序列化的讨论. 在诊断web ...

  6. 序列化json对象,通过ajax传入asp.net mvc后台

    序列化json对象,通过ajax传入asp.net mvc后台 序列化json对象,通过ajax传入asp.net mvc后台   今天遇到一个问题,准备把组织好的json对象通过jquery.aja ...

  7. Pythoy 数据类型序列化——json&pickle 模块

    Pythoy 数据类型序列化--json&pickle 模块 TOC 什么是序列化/反序列化 pickle 模块 json 模块 对比json和pickle json.tool 命令行接口 什 ...

  8. mvc 使用Newtonsoft.Json进行序列化json数据

    mvc 使用Newtonsoft.Json进行序列化json数据 JsonResult  使用js 序列号化,先集成扩展.使用newtonsoft http://blog.csdn.net/zhang ...

  9. c#序列化Json和反序列化

    1.首先确保程序集中添加了  System.Web.Extensions    DLL引用 2.代码中添加命名空间:using System.Web.Script.Serialization; nam ...

随机推荐

  1. Jquery的初识

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. data URI

    参考资料:http://www.cnblogs.com/hustskyking/p/data-uri.html 与http,ftp等协议类似,data URL也是一种协议,不同的是它直接将数据(编码或 ...

  3. CSS transition 过渡 详解

    transition 过渡 IE10.Firefox.Chrome.Opera 支持 transition 属性. Safari 需要前缀 -webkit-. Chrome 25 以及更早版本需要前缀 ...

  4. WPF 数据绑定基础

    纯理论,可能会枯燥. .net 技术群: 199281001 ,欢迎加入. 1.目标对象一定是派生自DependencyObject的对象,并且目标属性必须是依赖属性,否则数据绑定操作将会失   败. ...

  5. ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇(转)

    ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇   阅读目录 ASP.NET Identity 前世今生 建立 ASP.NET Identity 使用ASP.NET ...

  6. 如何调试R程序(转载)

    R语言的调试重要性不言而喻,这段时间准备改进一个R的包,但由于接触R时间不长,中间的很多东西不懂,需要重新打包调试,以对里面的很多程序有深入了解,下面从几个方面分享一下我的收获. 1.准备工作 a)R ...

  7. ThinkPHP邮件发送函数示例

    ThinkPHP邮件发送函数示例详解 /** * 发送邮件 * @param $tomail * @param $subject * @param $body * @param string $con ...

  8. 使用Angular和Nodejs搭建聊天室

    一,利用Node搭建静态服务器 这个是这个项目的底层支撑部分.用来支持静态资源文件像html, css, gif, jpg, png, javascript, json, plain text等等静态 ...

  9. Android 字体和颜色

        对于能够显示文字的控件(如TextView EditText RadioButton Button CheckBox Chronometer等等),你有时需要控制字体的大小.Android平台 ...

  10. codeforces 258div2 B Sort the Array

    题目链接:http://codeforces.com/contest/451/problem/B 解题报告:给出一个序列,要你判断这个序列能不能通过将其中某个子序列翻转使其成为升序的序列. 我的做法有 ...