ASP.NET Web API ist eine großartige Technologie. Das Schreiben von Web-APIs ist so einfach, dass viele Entwickler keine Zeit damit verbringen, ihre Anwendungen zu strukturieren, um eine gute Leistung zu erzielen.
In diesem Artikel stelle ich 8 Techniken zur Verbesserung der Leistung der ASP.NET-Web-API vor.
1) Verwenden Sie das schnellste JSON-Serialisierungstool
JSON-Serialisierung hat einen entscheidenden Einfluss auf die Leistung der gesamten ASP.NET-Web-API. Bei einem meiner Projekte bin ich anderthalb Jahre lang vom JSON.NET-Serialisierungstool auf ServiceStack.Text umgestiegen.
Ich habe gemessen, dass die Leistung der Web-API um etwa 20 % gestiegen ist. Ich empfehle Ihnen dringend, dieses Serialisierungstool auszuprobieren. Hier finden Sie einige aktuelle Vergleichsdaten zur Leistung gängiger Serialisierungstools.
Quelle: theburningmonk
Update: Es scheint, dass StackOverflow Jil verwendet, von dem sie behaupten, dass es das bislang schnellste JSON-Serialisierungstool ist. Testdaten finden Sie auf der GitHub-Seite Jil Serializer.
2) Manuelle Serialisierung von JSON von DataReader
Ich habe diese Methode in meinem Projekt verwendet und Leistungsvorteile erzielt.
Sie können JSON-Strings manuell aus dem DataReader erstellen und unnötige Objekterstellung vermeiden. Auf diese Weise müssen Sie keine Werte aus dem DataReader übernehmen und Objekte schreiben und dann Werte aus diesen Objekten übernehmen Verwenden Sie den JSON-Serializer, um JSON zu generieren.
Verwenden Sie StringBuilder, um JSON zu generieren und StringContent am Ende als Inhalt der Antwort in WebAPI zurückzugeben.
var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StringContent(jsonResult, Encoding.UTF8, "application/json"); return response;
Weitere Methoden finden Sie im Blog von Rick Strahl
3) Verwenden Sie so weit wie möglich andere Protokollformate (Protokollpuffer, Nachrichtenpaket)
Wenn Sie können Geben Sie in Ihrem Projekt andere Nachrichtenformate an, z. B. Protocol Buffers oder MessagePack, anstatt JSON zu verwenden.
Sie erhalten enorme Leistungsvorteile, nicht nur, weil die Serialisierung von Protokollpuffern sehr schnell ist, sondern auch, weil die Formatierung der zurückgegebenen Ergebnisse schneller ist als bei JSON.
4) Komprimierung implementieren
Verwenden Sie GZIP oder Deflate in Ihrer ASP.NET-Web-API.
Komprimierung ist eine einfache und effektive Möglichkeit, die Größe des Antwortpakets und die Antwortgeschwindigkeit zu reduzieren.
Dies ist eine sehr notwendige Funktion. Weitere Artikel zur Komprimierung finden Sie in meinem Blog ASP.NET Web API GZip-Komprimierung ActionFilter mit 8 Codezeilen.
5 ) Verwendung von Caching
Die Verwendung von Ausgabe-Caching in Web-API-Methoden ist tiefgreifend, wenn beispielsweise eine große Anzahl von Benutzern auf denselben Antwortinhalt zugreift, der sich nur einmal am Tag ändert.
Wenn Sie manuelles Caching implementieren möchten, z. B. das Zwischenspeichern von Benutzerkennwörtern im Speicher, lesen Sie bitte meinen Blog-Beitrag Einfache Möglichkeit, Caching in der ASP.NET-Web-API zu implementieren.
6) Verwenden Sie es so viel wie möglich Typisches ADO.NET
Manuell geschriebenes ADO.NET ist immer noch der schnellste Weg, Werte aus der Datenbank abzurufen. Wenn Ihnen die Web-API-Leistung wirklich wichtig ist, dann verwenden Sie keine ORMs.
Sie können einen Leistungsvergleich zwischen den beliebtesten ORMs sehen.
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请求。