[转载]8 种提升 ASP.NET Web API 性能的方法
http://www.oschina.net/translate/8-ways-improve-asp-net-web-api-performance
英文原文: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中响应的内容。
|
1
2
3
|
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 即可。
|
1
2
3
4
5
|
[HttpGet] public async Task OperationAsync() { await Task.Delay(2000); } |
8) 返回多个结果集和集合的组合
减少传输的次数不仅多数据库有好处,对于 Web API同样 ,你才有可能使用结果集的功能。
也就是说你可以从DataReader去提取多个结果集 参见以下演示代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 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 的一次响应中返回多个对象,试着将你的返回的多个对象进行组合后返回 如下:
|
1
2
3
4
5
6
|
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性能的方法
英文原文:8 ways to improve ASP.NET Web API performance ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没 ...
- 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 输出缓存 转载 -- Output caching in ASP.NET Web API
一.Nuget安装相关dll Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package ...
随机推荐
- RecyclerView 上拉加载下拉刷新
RecyclerView 上拉加载下拉刷新 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/teach_s ...
- jQuery之_事件绑定与解绑
使用jQuery实现事件的绑定和解绑 就是所谓的事件操作. 1. 事件绑定(2种): * eventName(function(){}) 绑定对应事件名的监听, 例如:$('#div').click( ...
- 英文词频统计的java实现方法
需求概要 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 分析 1.读取文件可使用BufferedReader ...
- Jquery 中 $.getJSON的用法
之前类似的方法用过 $.post, $.get,$.ajax,还是第一次用这个 $.getJSON. 前三个都是用作异步请求的,那么最后一个呢?其实也是异步请求的,和 $.get 最类似,因为他也是将 ...
- Java容器深入浅出之HashSet、TreeSet和EnumSet
Java集合中的Set接口,定义的是一类无顺序的.不可重复的对象集合.如果尝试添加相同的元素,add()方法会返回false,同时添加失败.Set接口包括3个主要的实现类:HashSet.TreeSe ...
- ajax异步请求loading
1.找到一张loading图片 2.添加样式 <style> .loadingWrap{ position:fixed; top:; left:; width:100%; height:1 ...
- HDU3452_Bonsai
题目的意思是给你一个棵树,每天边上有一个权值,现在要想根节点和每个叶子节点完全隔离开来,删除一些边,求最少需要删除的边权值综合是多少? 直接建模,以根节点为汇点,每个叶子节点连接虚拟源点流量无穷,树上 ...
- Python语言算法的时间复杂度和空间复杂度
算法复杂度分为时间复杂度和空间复杂度. 其作用: 时间复杂度是指执行算法所需要的计算工作量: 而空间复杂度是指执行这个算法所需要的内存空间. (算法的复杂性体现在运行该算法时的计算机所需资源的多少上, ...
- BZOJ5312 冒险(线段树)
记录区间and/or,修改时如果对整个区间影响都相同就打标记,否则递归.复杂度不太会证. #include<iostream> #include<cstdio> #includ ...
- 【bzoj3730】 震波
http://www.lydsy.com/JudgeOnline/problem.php?id=3730 (题目链接) 题意 给出一棵树,每个节点又一个权值.两个操作,询问距离节点${x}$不超过${ ...