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

來源:互聯網
上載者:User

標籤:

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.