ASP.NET Web APIは素晴らしいテクノロジーです。 Web API の作成は非常に簡単であるため、多くの開発者は、優れたパフォーマンスを実現するためにアプリケーションの構築に時間を費やしません。
この記事では、ASP.NET Web APIのパフォーマンスを向上させる8つのテクニックを紹介します。
1) 最速の JSON シリアル化ツールを使用します
JSON シリアル化は、ASP.NET Web API 全体のパフォーマンスに重大な影響を与えます。私のプロジェクトの 1 つでは、1 年半にわたって JSON.NET シリアル化ツールから ServiceStack.Text に切り替えました。
Web APIのパフォーマンスが約20%向上していることを計測しました。このシリアル化ツールを試してみることを強くお勧めします。ここでは、人気のあるシリアル化ツールのパフォーマンスに関する最近の比較データをいくつか紹介します。
出典: theburningmonk
更新: StackOverflow が Jil を使用しているようで、これはこれまでで最速の JSON シリアル化ツールであると主張されています。 テストデータは GitHub ページにあります Jil シリアライザー
2) DataReader から JSON を手動でシリアル化します
私は自分のプロジェクトでこの方法を使用し、パフォーマンスの利点を得ました。
DataReader から JSON 文字列を手動で作成し、不要なオブジェクトの作成を回避できるため、DataReader から値を取得してオブジェクトを書き込み、これらのオブジェクトから値を取得して JSON Serializer を使用して JSON を生成する必要がありません。
StringBuilder を使用して JSON を生成し、WebAPI の応答のコンテンツとして最後に StringContent を返します。var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StringContent(jsonResult, Encoding.UTF8, "application/json"); return response;
ADO.NET での手動書き込みは、依然としてデータベースから値を取得する最速の方法です。 Web API のパフォーマンスが本当に重要な場合は、ORM を使用しないでください 最も人気のある 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 的一次响应中返回多个对象,试着将你的返回的多个对象进行组合后返回 如下:
public class AggregateResult { public long MaxId { get; set; } public List<Folder> Folders{ get; set; } public List<User> Users{ get; set; } }
这种方式将减少对你的WEB API的HTTP请求。