推荐8项提高 ASP.NET Web API 性能的技术

  在本文中,我将介绍8项提高 ASP.NET Web API 性能的技术。

 1) 使用最快的 JSON 序列化工具

  JSON 的序列化对整个 ASP.NET Web API 的性能有着关键性的影响。在我的一个项目里,我从JSON.NET 序列化工具转到了ServiceStack.Text有一年半了。

  我测量过,Web API 的性能提升了20%左右。我强烈建议你去尝试一下这个序列化工具。这里有一些最近的流行序列化工具性能的比较数据。

  来源:theburningmonk

  更新: 似乎It seams that StackOverflow 使用了他们号称迄今为止最快的 JSON 序列化工具 Jil。 一测试数据可参见他们的GitHub page Jil serializer.

 2)从DataReader中手动串行化JSON

  我已经在我的项目中使用过这种方法,并获得了在性能上的福利。

  你可以手动地从DataReader创建JSON字符串并避免不必要的对象创建,这样你就不用从DataReader中取值并写入对象,再从这些对象中取值并使用JSON Serializer产生JSON.

  使用StringBuilder产生JSON,并在结尾处返回StringContent作为在WebAPI中响应的内容。

var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonResult, Encoding.UTF8, "application/json");
return response; 

  你可以在Rick Strahl's blog查看更多方法

 3)尽可能使用其它协议格式 (protocol buffer, message pack)

  如果你能给在你的工程中使用其它消息格式,如 Protocol Buffers或MessagePack 而不是使用JSON这种协议格式。

  你将能给获取到巨大的性能优势,不仅是因为Protocol Buffers 的序列化是非常快,而且比JSON在返回的结果格式化要更快。

 4)实现压缩

  在你的ASP.NET Web API中使用GZIP 或Deflate。

  对于减少响应包的大小和响应速度,压缩是一种简单而有效的方式。

  这是一个非常有必要使用的功能,你可以查看更多关于压缩的文章在我的博客ASP.NET Web API GZip compression ActionFilter with 8 lines of code.

 5) 使用caching

  在Web API方法中使用output caching意义深远.举例来说,如果大量用户访问同一个一天只改变一次的响应(response)内容。

  如果你想实现手动缓存,例如把用户口令缓存到内存,请参看我的博文Simple way to implement caching in ASP.NET Web API.

 6) 尽可能地使用典型的 ADO.NET

  手动编写的ADO.NET仍然是从数据库中取值的最快捷的方式。如果Web API的性能对你来说真的很重要,那么就不要使用ORMs.

  你可以看到最流行的ORM之间的性能比较.

  Dapper 和hand-written fetch code 很快,果不其然,所有的ORM都比这三种慢.

  带有resultset缓存的LLBLGen很快,但它要重新遍历一遍resultset并重新再内存中实例化对象。

 7)在 Web API 中实现异步方法

  使用异步的 Web API 服务大幅增加 Web API 对于Http 请求的处理数量。

  实现是简单的,只需使用async 的关键字和 将你方法的返回值类型改为Task 即可。

[HttpGet] public async Task OperationAsync()
{
await Task.Delay(2000);
}

 8) 返回多个结果集和集合的组合

  减少传输的次数不仅多数据库有好处,对于 Web API同样 ,你才有可能使用结果集的功能。

  也就是说你可以从DataReader去提取多个结果集 参见以下演示代码:

// read the first resultset
var reader = command.ExecuteReader(); 

// read the data from that resultset
while (reader.Read())
{
  suppliers.Add(PopulateSupplierFromIDataReader( reader ));
} 

// read the next resultset
reader.NextResult(); 

// read the data from that second resultset
while (reader.Read())
{
  products.Add(PopulateProductFromIDataReader( reader ));
}

  你可以在一个 Web API 的一次响应中返回多个对象,试着将你的返回的多个对象进行组合后返回 如下:

class AggregateResult{     public long MaxId { get; set; }     public List<Folder> Folders{ get; set; }     public List<User>  Users{ get; set; }}

  这种方式将减少对你的WEB API的HTTP请求。

  感谢你读读这篇文章。

时间: 2014-08-28

分享提高ASP.NET Web应用性能的技巧

在这篇文章中,将介绍一些提高 ASP.NET Web 应用性能的方法和技巧.众所周知,解决性能问题是一项繁琐的工作,当出现性能问题,每个人都会归咎于编写代码的开发人员. 那性能问题到底该如何解决?以下是应用系统发布前,作为 .NET 开发人员需要检查的点. 1.debug=「false」 当创建 ASP.NET Web应用程序,默认设置为「true」.开发过程中,设置为「true」是非常有用多,但在应用程序发布部署时,需将其设置为「false」. <compilation defaultLang

提高Web性能的前端优化技巧总结

这篇文章讲述可以帮助 改善优化前端的技术,非常有用.主要内容有清理代码.压缩图片.压缩外部资源.使用CDN,以及一些其它方法.这些方法会为你的网站带显著的速度提升和整体性能提升. 一. 清理 HTML 文档 HTML,即超文本标记语言,几乎是所有网站的支柱.HTML 为网页带来标题.子标题.列表和其它一些文档结构的格式.在最近更新的 HTML5 中,甚至可以创建图表. HTML 很容易被网络爬虫识别,因此搜索引擎可以根据网站的内容在一定程度上实时更新.在写 HTML 的时候,你应该尝试让它 简洁

单台web服务器如何尽可能的提高网站性能

我觉得首先要选择一个合适的环境,对于大多数php站点来说,运行在lnmp(linux+nginx+mysql+php)环境下是个理想的选择. 首先一点linux对比win的优势我就不说了. 其次nginx的优势总结起来就是负载均衡,高并发性能优异. 这里php采用fastcgi的方式接入nginx,php5.3 自带的php-fpm已经很好了,相比于apache的php模块方式,这里由php自己直接处理php请求是比较好的,并且可调控进程数量以优化并发性能. 上面说的是基本环境,我有一台q660

提高Web页面的性能(二)

1. 尽早清除缓冲区 [server]  2. AJAX 请求使用"GET"方法 [server]  3. 延迟加载组件 [content]  4. 预加载组件 [content]  5. 减少 DOM 元素的数量 [content]  6. 跨域分离组件 [content]  7. 减少 iframes 的数量 [content]  8. 不出现 404 [content]  9. 减小 cookie 的体积 [cookie]  10. 为组件使用 cookie-free 的域名 [

Web 前端设计模式--Dom重构 提高显示性能

1. 设计场景 首页那边有一个产品浏览的版块在延迟载入的时候,将我所有的隐藏帧的项都显示出来(如图,我本意是显示两行图片,可是在载入卡住,将下面一些隐藏元素都显示出来了),整体画面粗糙凌乱,整个网页完全载入并顺利运行的时间延迟超过5秒,在这种交互性极强的在线印刷网站是非常致命的,这给用户一种极其糟糕的Web体验,并归结为网站的不稳定... 此时不能责怪公司的服务器烂,网速卡之类的,那样很可能会导致老大对我一顿胖揍甚至扣奖金... 所以只能从网站性能方面进行改良... 2.设计目标 减少页面载入时

Web前端设计模式 制作漂亮的弹出层

现在问题来了,这个版块不大,更新频率却很高,每天都有十数条最新的信息上去,浏览网站的会员对于最新图书的了解和需求越来越大,因此需要对这个板块进行改良,以满足会员的需求,会员的主要要求有以下几个方面:显示该最新上架的图书的封面缩略图,该图书的名称和作者名称,以及该书部分内容的介绍和作者的简介... 这下把Ben给愁坏掉了,首页上根本就没有多余的空间,怎么来呈现封面缩略图甚至是内容简介,如果去掉别的板块空间来实现这一板块的扩张,无异于在一家公司以牺牲一个部门来壮大另外一个部门,这是万万不可取的...

通过 Dom 方法提高 innerHTML 性能

复制代码 代码如下: function replaceHtml(el, html) {     var oldEl = typeof el === "string" ? document.getElementById(el) : el;     /*@cc_on // 原始的 innerHTML 在 IE 中的性能好一点         oldEl.innerHTML = html;         return oldEl;     @*/     var newEl = oldEl

jQuery 验证插件 Web前端设计模式(asp.net)

设计目标:建立一个基于jQuery框架的通用Web验证插件... 设计要求:1.需要漂亮的css样式及小图标的润饰... 2.基于jQuery框架... 3.调用.net Web 服务来实现与数据库的异步交互... 解决方案:1.首先,我们来设计三个类,分别用来显示Web给用户的视觉感知.它们分别是 .msg_warning{font-family:Arial,Helvetica,sans-serif,simsun; background:#e7f7ff url(register/MsgWarn

WEB前端性能优化的7大手段详解

减少请求数量 合并 如果不进行文件合并,有如下3个隐患 1.文件与文件之间有插入的上行请求,增加了N-1个网络延迟 2.受丢包问题影响更严重 3.经过代理服务器时可能会被断开 但是,文件合并本身也有自己的问题 1.首屏渲染问题 2.缓存失效问题 所以,对于文件合并,有如下改进建议 1.公共库合并 2.不同页面单独合并 图片处理 1.雪碧图 CSS雪碧图是以前非常流行的技术,把网站上的一些图片整合到一张单独的图片中,可以减少网站的HTTP请求数量,但是当整合图片比较大时,一次加载比较慢.随着字体图

写给前端工程师的Web前端性能优化的10点建议

1. 减少HTTP请求 在浏览器(客户端)和服务器发生通信时,就已经消耗了大量的时间,尤其是在网络情况比较糟糕的时候,这个问题尤其的突出. 一个正常HTTP请求的流程简述:如在浏览器中输入"www.xxxxxx.com"并按下回车,浏览器再与这个URL指向的服务器建立连接,然后浏览器才能向服务器发送请求信息,服务器在接受到请求的信息后再返回相应的信息,浏览器接收到来自服务器的应答信息后,对这些数据解释执行. HTTP协议是无状态的应用层协议,意味着每次HTTP请求都需要建立通信链路.进

JavaScript提高网站性能优化的建议(二)

在javascript关于提高网站性能的几点建议(一)中,从HTTP请求到页面渲染几个方面对提高网站性能提出了几点建议,本文是学习Steve Sounders的另外一本书<高性能网站建设进阶指南>之后,从JavaScript性能的角度进行总结概括,诸君共勉. JavaScript性能是实现高性能Web应用程序的关键 --Steve Sounders 1 利用js作用域链 作用域链(scope chain) 当执行一段JavaScript代码(全局代码或函数)时,JavaScript引擎会创建为

浅谈DOM的操作以及性能优化问题-重绘重排

写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScript)各自想象为一个岛屿,它们之间用收费桥梁连接,ECMAScript每次访问DOM,都要途径这座桥,并交纳"过桥费",访问DOM的次数越多,费用也就越高.因此,推荐的做法是尽量减少过桥的次数,努力待在ECMAScript岛上.我们不可能不用DOM的接口,那么,怎样才能提高程序的效率? 既然

WEB 前端开发中防治重复提交的实现方法

web前端数据请求或者表单提交往往通过对dom的点击事件来操作,但是往往因为认为点击过快(少年手速挺快的嘛),或者因为响应等待使得用户误人为没操作而重复很多次点击,造成表单数据的连续重复提交,造成用户体检的不好,甚至影响到整个系统的安全性.而前端的防治重复提交至少很有效的防治了人为正常操作下的很多不必要麻烦.下面就来讲讲如何有效避免前端的表单重复提交 表单提交有以下几种方式: <form name="form" method="post" action=&qu