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%左右。 我强烈建议你去尝试一下这个序列化工具。这里有一些最近的流行序列化工具性能的比较数据。

来源: theburningmonk

更新: 似乎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之间的性能比较.

Dapperhand-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去提取多个结果集 参见以下演示代码:

?
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 { getset; }
     public List<Folder> Folders{ getset; }
     public List<User>  Users{ getset; }
}

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

转载于:https://www.cnblogs.com/ShaYeBlog/p/6029119.html

ASP.NET Web API 提升性能的方法实践相关推荐

  1. Asp.net Web Api开发 性能:使用Jil提升Json序列化性能

    from:http://blog.csdn.net/sqqyq/article/details/51692342 看了几篇网上关于各种序列化工具的性能对比,在这里再粘贴下: 我们使用了ASP.NET ...

  2. 8种提升ASP.NET Web API性能的方法

    英文原文:8 ways to improve ASP.NET Web API performance ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没 ...

  3. 使用Jil序列化JSON提升Asp.net web api 性能

    JSON序列化无疑是Asp.net web api 里面性能提升最重要的一环. 在Asp.net web api 里面我们可以插入自定义的MediaTypeFormatter(媒体格式化器), 说白了 ...

  4. ASP.NET Web API接受AngualrJS的QueryString的两种方式

    ASP.NET Web API如何接受来自AngualrJS的QueryString呢?本篇体验两种方式. 第一种方式:http://localhost:49705/api/products?sear ...

  5. 恶梦护士 asa_噩梦就是JSON日期。 另外,JSON.NET和ASP.NET Web API

    恶梦护士 asa Ints are easy. Strings are mostly easy. Dates? A nightmare. They always will be. There's di ...

  6. Asp.net Web Api开发(第二篇)性能:使用Jil提升Json序列化性能

    看了几篇网上关于各种序列化工具的性能对比,在这里再粘贴下: 我们使用了ASP.NET WEB API来提供RESTfull风格的接口给APP调用,默认序列化库用的是:Newtonsoft.Json 为 ...

  7. ASP.NET MVC4中调用WEB API的四个方法

    当今的软件开发中,设计软件的服务并将其通过网络对外发布,让各种客户端去使用服务已经是十分普遍的做法.就.NET而言,目前提供了Remoting,WebService和WCF服务,这都能开发出功能十分强 ...

  8. ASP.NET Web API 记录请求响应数据到日志的一个方法

    原文:ASP.NET Web API 记录请求响应数据到日志的一个方法 原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-resp ...

  9. 提升Web应用程序性能的最佳实践

    2019独角兽企业重金招聘Python工程师标准>>> 导读:作为开发人员,Web页面加载或刷新的速度对其网站至关重要.在浏览器中调整性能问题比在Java应用程 序中更难.开发人员在 ...

最新文章

  1. CV算法复现(分类算法1/6):LeNet5(1998年 LeCun)
  2. 2016政策与市场协同发力大数据,小公司如何搏杀BAT?
  3. B03_NumPy创建数组(numpy.empty,numpy.zeros,numpy.ones)
  4. [长流支流]的专栏--《金质打印通》、《WebMIS.NET快速开发平台》,MIS/ERP开发利器...
  5. MyEclipse for Windows快捷键
  6. ubyntu 链接mysql_ubuntu mysql远程连接
  7. 学习Numpy,看这篇文章就够啦
  8. cad填充密度怎么调整_CAD填充图案放在哪里,这几步你要了解
  9. NetSetMan v5.0.5特别版
  10. it行业se是_计算机行业SSE、SE、BSE、PE、PL各自是什么职位意思?
  11. 狮子鱼社区团购系统团长推广二维码不显示,以及选择地址失败的解决方案
  12. php输出白天时间,php 判断白天黑夜
  13. excel中时间差的计算
  14. 维图PDMS切图软件
  15. H750移植rt_thread操作系统完整工程分享,包括外部FLASH分散加载文件
  16. [笔记]Windows核心编程《二十》DLL的高级操作技术
  17. html5图片点击放大
  18. 【基操】word插入的表格无法修改列宽
  19. KONG和KONGA部署及配置
  20. 真c++ 从二叉树到红黑树(6)之红黑树RedBlack

热门文章

  1. 蓝桥杯java 大纲,2019 第十届蓝桥杯Java省赛B组个人总结
  2. Python入门--字典的创建
  3. 常见图片格式与调色算法
  4. 置换群Polya定理(poj 2409: Let it Bead)
  5. 斯特林公式--求n!的位数
  6. [Python] 创建一个整数列表:range()
  7. java读取、生成图片
  8. 在LaTex中插入代码块
  9. 腾讯云配置Ubuntu使用SSH登录
  10. 贺利坚老师汇编课程30笔记:将数据、代码、栈放入不同段