8 種提升 ASP.NET Web API 效能的方法

來源:互聯網
上載者:User

標籤:blog   http   使用   os   io   strong   資料   for   

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%左右。 我強烈建議你去嘗試一下這個序列化工具。這裡有一些最近的流行序列化工具效能的比較資料。

 

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

手動編寫的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去提取多個結果集 參見以下示範代碼:

?
1234567891011121314151617 // 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請求。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.