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
得到你的肯定是我最大的動力!