使用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

