推薦8項(xiàng)提高 ASP.NET Web API 性能的技術(shù)
在本文中,我將介紹8項(xiàng)提高 ASP.NET Web API 性能的技術(shù)。
1) 使用最快的 JSON 序列化工具
JSON 的序列化對(duì)整個(gè) ASP.NET Web API 的性能有著關(guān)鍵性的影響。在我的一個(gè)項(xiàng)目里,我從JSON.NET 序列化工具轉(zhuǎn)到了ServiceStack.Text有一年半了。
我測(cè)量過(guò),Web API 的性能提升了20%左右。我強(qiáng)烈建議你去嘗試一下這個(gè)序列化工具。這里有一些最近的流行序列化工具性能的比較數(shù)據(jù)。
來(lái)源:theburningmonk
更新: 似乎It seams that StackOverflow 使用了他們號(hào)稱迄今為止最快的 JSON 序列化工具 Jil。 一測(cè)試數(shù)據(jù)可參見(jiàn)他們的GitHub page Jil serializer.
2)從DataReader中手動(dòng)串行化JSON
我已經(jīng)在我的項(xiàng)目中使用過(guò)這種方法,并獲得了在性能上的福利。
你可以手動(dòng)地從DataReader創(chuàng)建JSON字符串并避免不必要的對(duì)象創(chuàng)建,這樣你就不用從DataReader中取值并寫(xiě)入對(duì)象,再?gòu)倪@些對(duì)象中取值并使用JSON Serializer產(chǎn)生JSON.
使用StringBuilder產(chǎn)生JSON,并在結(jié)尾處返回StringContent作為在WebAPI中響應(yīng)的內(nèi)容。
var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StringContent(jsonResult, Encoding.UTF8, "application/json"); return response;
你可以在Rick Strahl's blog查看更多方法
3)盡可能使用其它協(xié)議格式 (protocol buffer, message pack)
如果你能給在你的工程中使用其它消息格式,如 Protocol Buffers或MessagePack 而不是使用JSON這種協(xié)議格式。
你將能給獲取到巨大的性能優(yōu)勢(shì),不僅是因?yàn)镻rotocol Buffers 的序列化是非???而且比JSON在返回的結(jié)果格式化要更快。
4)實(shí)現(xiàn)壓縮
在你的ASP.NET Web API中使用GZIP 或Deflate。
對(duì)于減少響應(yīng)包的大小和響應(yīng)速度,壓縮是一種簡(jiǎn)單而有效的方式。
這是一個(gè)非常有必要使用的功能,你可以查看更多關(guān)于壓縮的文章在我的博客ASP.NET Web API GZip compression ActionFilter with 8 lines of code.
5) 使用caching
在Web API方法中使用output caching意義深遠(yuǎn).舉例來(lái)說(shuō),如果大量用戶訪問(wèn)同一個(gè)一天只改變一次的響應(yīng)(response)內(nèi)容。
如果你想實(shí)現(xiàn)手動(dòng)緩存,例如把用戶口令緩存到內(nèi)存,請(qǐng)參看我的博文Simple way to implement caching in ASP.NET Web API.
6) 盡可能地使用典型的 ADO.NET
手動(dòng)編寫(xiě)的ADO.NET仍然是從數(shù)據(jù)庫(kù)中取值的最快捷的方式。如果Web API的性能對(duì)你來(lái)說(shuō)真的很重要,那么就不要使用ORMs.
你可以看到最流行的ORM之間的性能比較.
Dapper 和hand-written fetch code 很快,果不其然,所有的ORM都比這三種慢.
帶有resultset緩存的LLBLGen很快,但它要重新遍歷一遍resultset并重新再內(nèi)存中實(shí)例化對(duì)象。
7)在 Web API 中實(shí)現(xiàn)異步方法
使用異步的 Web API 服務(wù)大幅增加 Web API 對(duì)于Http 請(qǐng)求的處理數(shù)量。
實(shí)現(xiàn)是簡(jiǎn)單的,只需使用async 的關(guān)鍵字和 將你方法的返回值類型改為T(mén)ask 即可。
[HttpGet] public async Task OperationAsync() { await Task.Delay(2000); }
8) 返回多個(gè)結(jié)果集和集合的組合
減少傳輸?shù)拇螖?shù)不僅多數(shù)據(jù)庫(kù)有好處,對(duì)于 Web API同樣 ,你才有可能使用結(jié)果集的功能。
也就是說(shuō)你可以從DataReader去提取多個(gè)結(jié)果集 參見(jiàn)以下演示代碼:
// 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 )); }
你可以在一個(gè) Web API 的一次響應(yīng)中返回多個(gè)對(duì)象,試著將你的返回的多個(gè)對(duì)象進(jìn)行組合后返回 如下:
class AggregateResult
{
public long MaxId { get; set; }
public List<Folder> Folders{ get; set; }
public List<User> Users{ get; set; }
}
這種方式將減少對(duì)你的WEB API的HTTP請(qǐng)求。
感謝你讀讀這篇文章。
相關(guān)文章
解決asp.net mvc UpdateModel更新對(duì)象后出現(xiàn)null問(wèn)題的方法
這篇文章主要介紹了解決asp.net mvc UpdateModel 更新對(duì)象后出現(xiàn)null問(wèn)題的方法,需要的朋友可以參考下2015-11-11ASP.NET記住登陸用戶名的具體實(shí)現(xiàn)
ASP.NET記住登陸用戶名的具體實(shí)現(xiàn),需要的朋友可以參考一下2013-06-06ASP.NET?MVC擴(kuò)展帶驗(yàn)證的單選按鈕
這篇文章實(shí)現(xiàn)了ASP.NET?MVC擴(kuò)展帶驗(yàn)證的單選按鈕功能,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09asp.net gridview實(shí)現(xiàn)全選,反選與刪除記錄的操作代碼
asp.net gridview實(shí)現(xiàn)全選,反選與刪除記錄的操作代碼,需要的朋友可以參考下。2011-07-07ASP.NET MVC重寫(xiě)RazorViewEngine實(shí)現(xiàn)多主題切換
這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC重寫(xiě)RazorViewEngine實(shí)現(xiàn)多主題切換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06asp.net下配置數(shù)據(jù)源時(shí)出現(xiàn): 未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例。
未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例的一個(gè)另類解決方法2008-06-06