改善ASP.NET Web API性能的八项技术
2015-06-19 11:14
543 查看
ASP.NET Web API是一项伟大的技术。编写Web API十分容易,以至于许多开发者都不愿花时间去想办法架构应用程序以获得更好的性能。
这篇文章中,我个人总结出了用于改善 ASP.NET Web API 性能的八项技术。
JSON serialization 能极大的影响ASP.NET Web API的整体性能。在一年半的时间里,我已经从某个项目中的JSON.NET serializer转到了ServiceStack.Text 。
现在的我的Web API 响应已经提升了约20%。强烈建议尝试这个serializer。以下是几个热门serializers最新的性能对比:
来源: theburningmonk
我将这种方法用在我的产品项目上,获得了很多性能方面的益处。
不必从 DataReader读取值后填充对象,然后转而又从那些对象读取值,最后使用某个JSON Serializer生成JSON。我是说你可以直接手动从DataReader 创建JSON串,从而避免创建不必要的对象。 先是用 StringBuilder生成JSON,最后你返回StringContent 作为你webAPI中的反馈内容。
更加详细的内容请看 Rick Strahl的blog
如果你能够在项目中使用其他格式如 Protocol Buffers 或MessagePack 而不是 JSON 的话那就赶紧换了吧。这样你可以获取极大的性能提升,这不仅是因为Protocol Buffers更快,还因为格式比JSON小,所以响应速度也就更迅速。
在你的ASP.NET Web API使用 GZIP 或 Deflate压缩。压缩是文件包瘦身和加速的一种行之有效的方法。
该功能必须要有,具体内容可查阅我先前的博文 ASP.NET Web API GZip compression
ActionFilter with 8 lines of code.
要是觉得有道理的话,在你的Web API methods试试输出缓存(output caching )。
如果你想要实现手动缓存,例如将用户口令缓存到内存上,可以参考我的博文Simple way to implement
caching in ASP.NET Web API.
手动编码ADO.NET仍是从数据库获取数据的最快捷方式。如果你真的很看重Web API的性能的话就不要使用ORMs。
可以参考下列这几个热门ORMs的最新性能对比:
Dapper和hand-written fetch code 如同预期那样,速度都非常快。所有ORMs都比前面三个慢。
LLBLGen 速度也很快,但它先得获取结果集然后再重新从内存实现对象。
用异步Web API服务能够增加Web API 所能处理的并发HTTP请求的数量。
要实现很简单。该操作用async关键词标记,返回类型变为Task。
减少至数据库和Web API的往返数量。应该尽可能使用多个结果集功能。这意味着你可以从DataReader提取多个结果集,就像下面这个例子:
在一次 Web API响应中返回尽可能多的对象。 试着把所有对象结合成一个汇总的:
通过这种方法就能减少你的Web API的HTTP请求数量。
这篇文章中,我个人总结出了用于改善 ASP.NET Web API 性能的八项技术。
1) 使用最快速的 JSON serializer
JSON serialization 能极大的影响ASP.NET Web API的整体性能。在一年半的时间里,我已经从某个项目中的JSON.NET serializer转到了ServiceStack.Text 。现在的我的Web API 响应已经提升了约20%。强烈建议尝试这个serializer。以下是几个热门serializers最新的性能对比:
来源: theburningmonk
2) 手动从DataReader创建JSON串
我将这种方法用在我的产品项目上,获得了很多性能方面的益处。不必从 DataReader读取值后填充对象,然后转而又从那些对象读取值,最后使用某个JSON Serializer生成JSON。我是说你可以直接手动从DataReader 创建JSON串,从而避免创建不必要的对象。 先是用 StringBuilder生成JSON,最后你返回StringContent 作为你webAPI中的反馈内容。
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) 缓存机制
要是觉得有道理的话,在你的Web API methods试试输出缓存(output caching )。如果你想要实现手动缓存,例如将用户口令缓存到内存上,可以参考我的博文Simple way to implement
caching in ASP.NET Web API.
6) 尽可能使用典型ADO.NET
手动编码ADO.NET仍是从数据库获取数据的最快捷方式。如果你真的很看重Web API的性能的话就不要使用ORMs。可以参考下列这几个热门ORMs的最新性能对比:
Dapper和hand-written fetch code 如同预期那样,速度都非常快。所有ORMs都比前面三个慢。
LLBLGen 速度也很快,但它先得获取结果集然后再重新从内存实现对象。
7) 实现异步
用异步Web API服务能够增加Web API 所能处理的并发HTTP请求的数量。要实现很简单。该操作用async关键词标记,返回类型变为Task。
8) 返回多个结果集并合并结果
减少至数据库和Web API的往返数量。应该尽可能使用多个结果集功能。这意味着你可以从DataReader提取多个结果集,就像下面这个例子:相关文章推荐
- ASP.Net增删查改写的一个通讯录系统---ShinePans
- ASP.NET Web API 用IE浏览器访问下载文件问题
- ASP.NET WebApi 文件上传功能
- Asp.net MVC Session过期异常的处理
- ASP.NET MVC中的Session设置
- web渗透(asp数字型注入模拟实战)
- Nancy和ASP.NET MVC的简单对比
- ListView 使用方法(Asp.Net)
- UIView的contentMode中scale和aspect的字面意思
- asp.net 打印控件使用方法
- ASP.NET MVC______VS2012
- excle,aspose.cells 公式字段值取不到 xmls转xml
- ASP.NET MVC中将控制器分离到类库的实现
- asp.net web应用程序不带后缀访问
- aspectc中this可以获取的东西
- asp.net Twilio
- ASP.NET使用MessageBox方法
- asp.net页面生命周期的文章推荐
- Asp.net WebApi 项目示例(增删改查)
- 手机电话号码吉凶查询原理及ASP算法源码 转