優(yōu)化 ASP.NET Core Web API 性能

開發(fā)人員嗨,構(gòu)建高性能的 ASP.NET Core Web API 非常重要。它可以幫助用戶享受更快的交互并降低服務(wù)器成本。本文將指導(dǎo)你了解 ASP.NET Core Web API 的一些實用性能優(yōu)化技巧。

1. 使用異步代碼

重要性:
異步代碼允許您的應(yīng)用程序同時處理更多請求。因為它在等待任務(wù)完成的同時釋放了資源。

如何使用:
用于 I/O 操作,如數(shù)據(jù)庫調(diào)用、文件讀取和網(wǎng)絡(luò)請求。ASP.NET Core 適用于異步代碼。這是提高性能的好方法。asyncawait

public async Task<IActionResult> GetData()  
{
var data = await _dataService.GetDataAsync();
return Ok(data);
}

2. 啟用響應(yīng)緩存

重要性:
緩存可以通過存儲響應(yīng)來節(jié)省時間。當類似的請求再次出現(xiàn)時,服務(wù)器可以返回緩存的響應(yīng),而無需再次處理它。

如何使用:
使用 attribute 來緩存響應(yīng)。您可以指定數(shù)據(jù)應(yīng)緩存多長時間。對于靜態(tài)數(shù)據(jù),緩存可以顯著降低服務(wù)器負載。[ResponseCache]

[HttpGet]  
[ResponseCache(Duration = 60)]
public IActionResult GetStaticData()
{
return Ok("This is cached data.");
}

3. 優(yōu)化數(shù)據(jù)庫查詢

重要性:
緩慢的數(shù)據(jù)庫查詢會損害 API 性能。API 等待數(shù)據(jù)的時間越長,響應(yīng)速度就越慢。

如何優(yōu)化:

下面是一個使用 pagination 的示例:

public async Task<IActionResult> GetPagedData(int page = 1, int pageSize = 10)  
{
var data = await _context.Data
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToListAsync();
return Ok(data);
}

4. 使用依賴注入

重要性:
依賴注入 (DI) 改進了代碼組織和測試。但是,管理不善的 DI 可能會導(dǎo)致性能問題。

使用方法:
正確設(shè)置服務(wù)生命周期:

// Singleton service for static data  
services.AddSingleton<IStaticDataService, StaticDataService>();
// Scoped service for per-request data
services.AddScoped<IRequestService, RequestService>();
// Transient service for lightweight operations
services.AddTransient<IUtilityService, UtilityService>();

5. 最小化中間件

重要性:
每個 middleware 都會為每個請求增加處理時間。太多的中間件會降低 API 的速度。

如何使用:
只添加必要的中間件。避免添加不需要的中間件。

var app = builder.Build();  

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});

6. 啟用 HTTP 壓縮

重要性:
壓縮會減小響應(yīng)大小。較小的響應(yīng)傳輸和加載速度更快。

使用方法:
在 中啟用響應(yīng)壓縮。使用 Gzip 或 Brotli 壓縮以獲得常見的性能提升。Startup.cs

public void ConfigureServices(IServiceCollection services)  
{
services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
});
}

7. 使用 JSON 序列化選項

重要性:
ASP.NET Core 使用 JSON 來格式化響應(yīng)。優(yōu)化序列化可縮短處理時間。

如何使用:
使用代替 .它速度更快,并針對 .NET Core 進行了優(yōu)化。此外,如果不需要,請禁用區(qū)分大小寫和默認 null 值等功能。System.Text.JsonNewtonsoft.Json

public void ConfigureServices(IServiceCollection services)  
{
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
});
}

8. 使用內(nèi)容托管網(wǎng)絡(luò) (CDN)

重要性:
如果您提供靜態(tài)文件(如圖像和腳本),CDN 可以提供幫助。CDN 將文件存儲在世界各地的許多地方。用戶可以從附近的位置加載文件,從而加快加載速度。

如何使用:
在 CDN 上托管靜態(tài)文件或為您的服務(wù)器啟用 CDN。在 API 或前端代碼中使用指向這些文件的鏈接。

9. 減少異常拋出

重要性:
引發(fā)異常可能代價高昂。它需要額外的資源來捕獲、記錄和處理它們。

使用方法:
避免為常規(guī)控制流拋出異常。請改用驗證檢查。

// Instead of throwing an exception, return a 404 if not found  
var data = await _dataService.GetDataByIdAsync(id);
if (data == null)
{
return NotFound();
}
return Ok(data);

12. 分析和監(jiān)控您的 API

重要性:
監(jiān)控可讓您跟蹤一段時間內(nèi)的性能。您可以找到瓶頸和需要改進的領(lǐng)域。

如何使用:
使用 Application Insights、Prometheus 或 Grafana 等工具。跟蹤請求持續(xù)時間、錯誤率和內(nèi)存使用情況等指標。

// Sample Application Insights setup  
services.AddApplicationInsightsTelemetry(Configuration["APPINSIGHTS_CONNECTIONSTRING"]);

13. 使用 DTO 優(yōu)化數(shù)據(jù)傳輸

重要性:
通過網(wǎng)絡(luò)發(fā)送大型對象會減慢響應(yīng)時間。數(shù)據(jù)傳輸對象 (DTO) 是數(shù)據(jù)模型的簡化版本,僅包含必要的字段。

如何使用:
為每個請求/響應(yīng)創(chuàng)建 DTO 并僅映射所需的屬性。

public class UserDto  
{
public int Id { get; set; }
public string Name { get; set; }
}

然后,將數(shù)據(jù)模型映射到 DTO:

var userDto = new UserDto { Id = user.Id, Name = user.Name };  
return Ok(userDto);

14. 使用連接池

重要性:
數(shù)據(jù)庫連接的打開和關(guān)閉速度可能很慢。連接池重用現(xiàn)有連接,從而提高速度。

如何使用:
默認情況下,大多數(shù) ASP.NET Core 數(shù)據(jù)庫庫都支持池化。對于 SQL 數(shù)據(jù)庫,默認情況下,在 Entity Framework Core 中啟用連接池。只需確保配置正確即可。

15. 使用 Redis 進行緩存

重要性:
內(nèi)存緩存速度很快,但 Redis 可以在多個服務(wù)器上提供分布式緩存。

如何使用:
在 ASP.NET Core 中將 Redis 設(shè)置為分布式緩存。將其配置為緩存經(jīng)常訪問的數(shù)據(jù),如用戶會話。

services.AddStackExchangeRedisCache(options =>  
{
options.Configuration = "localhost:6379";
});

16. 避免過度使用 LINQ

重要性:
LINQ 查詢使代碼可讀,但對于復(fù)雜操作可能會變慢。避免在性能敏感的代碼中使用它。

如何使用:
如果性能至關(guān)重要,請用優(yōu)化的替代方案替換復(fù)雜的 LINQ 查詢。有時,直接 SQL 查詢更快。

// Inefficient LINQ query  
var data = _context.Data.Where(x => x.IsActive).ToList();
// More efficient alternative
var data = _context.Data.FromSqlRaw("SELECT * FROM Data WHERE IsActive = 1").ToList();

提高 ASP.NET Core Web API 的性能需要時間和測試。這些提示可以通過減少服務(wù)器負載和響應(yīng)時間來發(fā)揮作用。首先應(yīng)用一些符合您的 API 需求的提示,然后監(jiān)控影響。逐漸地,您將看到速度和用戶滿意度的改進。

本文章轉(zhuǎn)載微信公眾號@架構(gòu)師老盧

上一篇:

vue 中 Axios 的封裝和 API 接口的管理

下一篇:

22條API設(shè)計的最佳實踐
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費