8种提升ASP.NET Web API性能的方法
英文原文:8 ways to improve ASP.NET Web API performance
ASP.NET Web API 是非常棒的技术。编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能。
在本文中,我将介绍 8 项提高 ASP.NET Web API 性能的技术。
1、使用最快的 JSON 序列化工具
JSON 的序列化对整个 ASP.NET Web API 的性能有着关键性的影响。 在我的一个项目里,我从 JSON.NET 序列化工具转到了 ServiceStack.Text 有一年半了。
我测量过,Web API 的性能提升了 20% 左右。 我强烈建议你去尝试一下这个序列化工具。这里有一些最近的流行序列化工具性能的比较数据。

更新: 似乎 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

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 的一次响应中返回多个对象,试着将你的返回的多个对象进行组合后返回如下:
public class AggregateResult
{
public long MaxId { get; set; }
public List<Folder> Folders{ get; set; }
public List<User> Users{ get; set; }
}
这种方式将减少对你的 WEB API 的 HTTP 请求。
8种提升ASP.NET Web API性能的方法的更多相关文章
- 8 种提升 ASP.NET Web API 性能的方法
ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...
- [转载]8 种提升 ASP.NET Web API 性能的方法
http://www.oschina.net/translate/8-ways-improve-asp-net-web-api-performance 英文原文:8 ways to improve A ...
- 8 种提升 ASP.NET Web API 性能的方法 (转)
出处:http://www.oschina.net/translate/8-ways-improve-asp-net-web-api-performance ASP.NET Web API 是非常棒的 ...
- 8 种提升ASP.NET Web API性能的方法
ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...
- 8种提升 ASP.NET Web API 性能的方法
- 六种简单方法提升ASP.NET Web API性能
ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...
- 使用Jil序列化JSON提升Asp.net web api 性能
JSON序列化无疑是Asp.net web api 里面性能提升最重要的一环. 在Asp.net web api 里面我们可以插入自定义的MediaTypeFormatter(媒体格式化器), 说白了 ...
- 如何让ASP.NET Web API的Action方法在希望的Culture下执行
在今天编辑推荐的<Hello Web API系列教程--Web API与国际化>一文中,作者通过自定义的HttpMessageHandler的方式根据请求的Accep-Language报头 ...
- ASP.NET Web API 提升性能的方法实践
ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...
随机推荐
- 洛谷P2678跳石头题解
题目 这个题也是一个很经典的题了.其主要思想也是二分答案,原因就是题目中只要出现最大值最小或最小值最大,这种描述十有八九就是二分答案. 这个题原题也是让我们求最短的跳跃距离的最大值. 显而易见,最大值 ...
- Failed to load package MonoAndroidDesignerPackage
from : https://developercommunity.visualstudio.com/content/problem/160124/failed-to-load-package-mon ...
- 【BZOJ4316】小C的独立集(动态规划)
[BZOJ4316]小C的独立集(动态规划) 题面 BZOJ 题解 考虑树的独立集求法 设\(f[i][0/1]\)表示\(i\)这个点一定不选,以及\(i\)这个点无所谓的最大值 转移\(f[u][ ...
- 【原创】hdu1698 Just a Hook(线段树→区间更新,区间查询)
学习线段树第二天,这道题属于第二简单的线段树,第一简单是单点更新,这个属于区间更新. 区间更新就是lazy思想,我来按照自己浅薄的理解谈谈lazy思想: 就是在数据结构中,树形结构可以线性存储(线性表 ...
- webRequest封装
from requests.models import Response import requests import random import time class WebRequest(obje ...
- 定时自动从FTP服务器取数据脚本
环境需求:某些情况下经常需要向FTP服务器取文件,可以用定时任务执行简单脚本自动去取相应文件. 一般用法: ~]# ftp IP地址 端口 //ftp命令可以通过yum install ftp方式 ...
- java ee wildfly spring 在线程池的线程中注入
public class RtmpSpyingTests extends AbstractTransactionalJUnit4SpringContextTests { @Autowired Thre ...
- “adb不是内部或外部命令,也不是可运行的程序或批量文件“
首先这个问题有两种可能: 1.就是没有配置环境变量, 这个只需要将android安装:例如C:\Program File\android-sdk-windows\tools加入到 系统变量Path中, ...
- django orm 重点大全
1.最简单的跨表,查询外键表中符合主表条件的记录列表 #用户类型表 class User_typ(models.Model): name=models.CharField(max_length=32) ...
- 安全测试之Top 10 漏洞的分析
1. 问题:没有被验证的输入 测试方法: 数据类型(字符串,整型,实数,等) 允许的字符集 最小和最大的长度 是否允许空输入 参数是否是必须的 重复是否允许 数值范围 特定的值(枚举型) 特定的模式 ...