当前位置: 移动技术网 > IT编程>开发语言>.net > 推荐8项提高 ASP.NET Web API 性能的技术

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

2017年12月12日  | 移动技术网IT编程  | 我要评论

章家瑄,piao海镇,国际象棋入门教程

  在本文中,我将介绍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请求。

  感谢你读读这篇文章。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网