ASP.NET 核心性能优化技巧

科技   2024-11-21 05:30   上海  


应用程序性能已成为当今快节奏数字世界中的关键差异化因素。最终用户希望应用程序能够快速加载。延迟会导致更高的退回率和收入损失。ASP.NET Core 被认为是一个众所周知的 Web 应用程序开发平台,最适合高性能和可扩展的应用程序。但是,开发人员必须使用不同的策略来确保他们获得必要的性能和可伸缩性。

在本博客中,我们将讨论提高 ASP.NET Core 应用程序性能的实用技巧和最佳实践。我们将使用缓存、压缩和其他有助于最大限度地提高应用程序性能和响应能力的技术。

1. 实施缓存以减少服务器负载

缓存是提高 ASP.NET Core 应用程序性能的最简单、最有效的方法之一。通过将经常访问的数据存储在内存中,可以减少重复查询数据库或重新生成内容的需要,从而减少服务器负载并缩短响应时间。

a. 响应缓存

响应缓存存储 HTTP 响应的副本,以减少为多个请求创建相同响应的需要。您可以使用 ASP.NET Core 中的属性启用此功能。ResponseCache

[ResponseCache(Duration = 60)]
public IActionResult Index()
{
return View();
}

此示例将响应缓存 60 秒,确保每次都传递相同的响应,而无需重新生成内容。

b. 内存中缓存

内存中缓存将数据存储在服务器的内存中。它非常适合经常访问且不经常更改的小型数据。在 Startup.cs 中设置内存中缓存:

public void ConfigureServices(IServiceCollection services)  
{
services.AddMemoryCache();
}

然后在您的应用程序中使用它:

public class MyService  
{
private readonly IMemoryCache _cache;

public MyService(IMemoryCache cache)
{
_cache = cache;
}

public string GetData()
{
if (!_cache.TryGetValue("cachedData", out string data))
{
data = "Expensive Data";
_cache.Set("cachedData", data, TimeSpan.FromMinutes(10));
}
return data;
}
}

c. 分布式缓存

如果您使用多个应用程序服务器或需要持久缓存, 分布式缓存(例如, NCache, Redis) 是更好的选择。分布式缓存中缓存的数据可跨应用程序实例访问。

public void ConfigureServices(IServiceCollection services)  
{
services.AddNCacheDistributedCache(configuration =>
{
configuration.CacheName = "democache";
configuration.EnableLogs = true;
configuration.ExceptionsEnabled = true;
});
}

2. 启用压缩以加快内容交付速度

减小服务器和客户端之间传输的数据大小可显著缩短应用程序加载时间。在 ASP.NET Core 中启用 Response Compression 有助于减小响应正文的大小。

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

ASP.NET Core 支持 gzip 和 Brotli 压缩,它们在服务器上压缩内容,并在客户端解压缩内容。要进一步优化性能,请考虑压缩 CSS、JavaScript 和图像等静态文件。

3. 优化数据库查询

高效的数据库交互对于应用程序性能至关重要。优化数据库查询可以显著减少加载时间。

a. 将 AsNoTracking 与 Entity Framework Core 配合使用

对于只读查询,using 通过跳过跟踪实体更改的开销来提高性能。AsNoTracking()

var users = _context.Users.AsNoTracking().ToList();

b. 避免 N+1 查询问题

单独查询相关数据时出现 N+1 问题,导致多次数据库调用。在 Entity Framework Core 中使用,在单个查询中加载相关实体。Include()

var users = _context.Users.Include(u => u.Orders).ToList();

c. 为数据库表编制索引

确保数据库表已正确编制索引。索引通过提供对数据库中行的快速访问来加快查询执行速度。

4. 使用高效的日志记录实践

日志记录对于调试和监控至关重要,但过多的日志记录可能会损害性能。通过以下方式优化日志记录:

  • 限制生产中的日志级别(例如,使用 Information 或 Warning 而不是 Verbose)。

  • 禁用或减少数据库日志记录。

  • 使用异步日志记录机制来避免阻塞关键进程。

public void ConfigureServices(IServiceCollection services)  
{
services.AddLogging(builder =>
{
builder.AddFilter("Microsoft", LogLevel.Warning)
.AddFilter("System", LogLevel.Warning);
});
}

5. 减少应用程序启动时间

启动时间会影响性能和用户体验。要缩短启动时间,请遵循以下做法:

a. 修剪不必要的依赖项

从配置中删除未使用的服务或依赖项。避免在应用程序启动期间加载不需要的模块。Startup.cs

b. 使用 ReadyToRun 编译

在 ASP.NET Core 应用程序中启用 ReadyToRun (R2R) 编译。它会预编译应用的代码,从而缩短启动和执行所需的时间。

在您的文件中,添加:.csproj

<PropertyGroup>  
<PublishReadyToRun>true</PublishReadyToRun>
</PropertyGroup>

6. 负载均衡和扩展

如果您的应用程序遇到高流量,请考虑使用负载均衡进行横向扩展,以便在多个服务器之间分配负载。

a. 水平缩放

如果应用程序的流量增加,请考虑通过负载均衡进行横向扩展,以便在多个服务器之间分配负载。

b.自动扩展

根据应用程序的要求激活自动扩展。建立阈值以响应流量波动自动增加或减少实例。

7. 优化静态文件交付

利用静态文件中间件直接从文件系统交付静态文件,绕过应用程序逻辑。ASP.NET Core 中的静态文件中间件对于提供图像、CSS 和 JavaScript 等内容非常有效。

app.UseStaticFiles();

要进行其他优化,请为静态文件启用 Content Caching

app.UseStaticFiles(new StaticFileOptions  
{
OnPrepareResponse = ctx =>
{
ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=600");
}
});

8. 使用 HTTP/2 提高性能

如果您在支持 HTTP/2 的服务器上托管应用程序,则启用它可以通过减少延迟、支持多路复用和最大限度地减少多个请求的开销来提高性能。

public void ConfigureKestrel(KestrelServerOptions options)  
{
options.Listen(IPAddress.Any, 5001, listenOptions =>
{
listenOptions.UseHttps();
listenOptions.Protocols = HttpProtocols.Http2;
});
}

9. 最小化视图渲染时间

优化视图并最大限度地减少部分视图渲染的数量可能会对响应时间产生重大影响。

a. 使用 View Caching

使用 缓存经常渲染的视图。ViewData

public void ConfigureServices(IServiceCollection services)  
{
services.AddMvc().AddRazorRuntimeCompilation();
}

增强 ASP.NET Core 应用程序的性能并不困难。如果您遵循以下性能优化理念,您的应用程序将运行得更快、更高效:缓存、压缩、优化数据库查询和缩短启动时间。

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

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