优化 ASP.NET Core Web API 性能方法

科技   2024-11-28 06:17   上海  


优化 ASP.NET Core Web API 性能

开发人员嗨,构建高性能的 ASP.NET Core Web API 非常重要。它可以帮助用户享受更快的交互并降低服务器成本。本文将指导你了解 ASP.NET Core Web API 的一些实用性能优化技巧。

1. 使用异步代码

重要性:
异步代码允许您的应用程序同时处理更多请求。因为它在等待任务完成的同时释放了资源。

如何使用:
用于 I/O 操作,如数据库调用、文件读取和网络请求。ASP.NET Core 适用于异步代码。这是提高性能的好方法。asyncawait

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

2. 启用响应缓存

重要性:
缓存可以通过存储响应来节省时间。当类似的请求再次出现时,服务器可以返回缓存的响应,而无需再次处理它。

如何使用:
使用 attribute 来缓存响应。您可以指定数据应缓存多长时间。对于静态数据,缓存可以显著降低服务器负载。[ResponseCache]

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

3. 优化数据库查询

重要性:
缓慢的数据库查询会损害 API 性能。API 等待数据的时间越长,响应速度就越慢。

如何优化:

  • 使用索引加快数据检索速度。

  • 避免。仅获取必要的列。SELECT *

  • 对大型数据集使用分页。

下面是一个使用 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 可能会导致性能问题。

使用方法:
正确设置服务生命周期:

  • 用于不变的对象。Singleton

  • 用于每个请求使用的服务。Scoped

  • 用于轻量级服务。Transient

// 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 压缩

重要性:
压缩会减小响应大小。较小的响应传输和加载速度更快。

使用方法:
在 中启用响应压缩。使用 Gzip 或 Brotli 压缩以获得常见的性能提升。Startup.cs

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

7. 使用 JSON 序列化选项

重要性:
ASP.NET Core 使用 JSON 来格式化响应。优化序列化可缩短处理时间。

如何使用:
使用代替 .它速度更快,并针对 .NET Core 进行了优化。此外,如果不需要,请禁用区分大小写和默认 null 值等功能。System.Text.JsonNewtonsoft.Json

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

8. 使用内容托管网络 (CDN)

重要性:
如果您提供静态文件(如图像和脚本),CDN 可以提供帮助。CDN 将文件存储在世界各地的许多地方。用户可以从附近的位置加载文件,从而加快加载速度。

如何使用:
在 CDN 上托管静态文件或为您的服务器启用 CDN。在 API 或前端代码中使用指向这些文件的链接。

9. 减少异常抛出

重要性:
引发异常可能代价高昂。它需要额外的资源来捕获、记录和处理它们。

使用方法:
避免为常规控制流抛出异常。请改用验证检查。

// 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. 分析和监控您的 API

重要性:
监控可让您跟踪一段时间内的性能。您可以找到瓶颈和需要改进的领域。

如何使用:
使用 Application Insights、Prometheus 或 Grafana 等工具。跟踪请求持续时间、错误率和内存使用情况等指标。

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

13. 使用 DTO 优化数据传输

重要性:
通过网络发送大型对象会减慢响应时间。数据传输对象 (DTO) 是数据模型的简化版本,仅包含必要的字段。

如何使用:
为每个请求/响应创建 DTO 并仅映射所需的属性。

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

然后,将数据模型映射到 DTO:

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

14. 使用连接池

重要性:
数据库连接的打开和关闭速度可能很慢。连接池重用现有连接,从而提高速度。

如何使用:
默认情况下,大多数 ASP.NET Core 数据库库都支持池化。对于 SQL 数据库,默认情况下,在 Entity Framework Core 中启用连接池。只需确保配置正确即可。

15. 使用 Redis 进行缓存

重要性:
内存缓存速度很快,但 Redis 可以在多个服务器上提供分布式缓存。

如何使用:
在 ASP.NET Core 中将 Redis 设置为分布式缓存。将其配置为缓存经常访问的数据,如用户会话。

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

16. 避免过度使用 LINQ

重要性:
LINQ 查询使代码可读,但对于复杂操作可能会变慢。避免在性能敏感的代码中使用它。

如何使用:
如果性能至关重要,请用优化的替代方案替换复杂的 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 的性能需要时间和测试。这些提示可以通过减少服务器负载和响应时间来发挥作用。首先应用一些符合您的 API 需求的提示,然后监控影响。逐渐地,您将看到速度和用户满意度的改进。

如果你喜欢我的文章,请给我一个赞!谢谢

架构师老卢
资深软件架构师, 分享编程、软件设计经验, 教授前沿技术, 分享技术资源(每天发布电子书),每天进步一点点...
 最新文章