zoukankan      html  css  js  c++  java
  • 使用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

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

  • 相关阅读:
    《谷歌网站站长指南》更新有关欺骗性重定向的内容
    【网站运营】网站被K的原因大总结
    Dedecms 首页调用副栏目内容方法
    完美企业网站的101项指标
    10 个强大的开源 Web 流量分析工具(转帖)
    在C#代码中应用Log4Net(五)将Log4Net正确地封装在自己的类库中并进行调用
    在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常
    在C#代码中应用Log4Net(三)Log4Net中配置文件的解释
    在C#代码中应用Log4Net(二)典型的使用方式
    在C#代码中应用Log4Net(一)简单使用Log4Net
  • 原文地址:https://www.cnblogs.com/liek/p/4888201.html
Copyright © 2011-2022 走看看