修复ASP.NET Core已弃用包:解决System.Text.Encodings.Web安全漏洞
解决.NET 6项目中System.Text.Encodings.Web漏洞与Microsoft.AspNetCore.Hosting.Abstractions弃用问题
步骤1:移除弃用的NuGet包
直接卸载项目中引用的Microsoft.AspNetCore.Hosting.Abstractions 2.2.0版本。.NET 6的ASP.NET Core共享框架已经内置了IWebHost等相关类型的定义,无需依赖这个旧版的独立包。卸载后,旧包带来的System.Text.Encodings.Web 4.5.0传递依赖会自动移除。
步骤2:显式升级System.Text.Encodings.Web
在项目文件(.csproj)中添加或更新System.Text.Encodings.Web的包引用,指定兼容.NET 6的安全版本(比如6.0.1及以上):
<PackageReference Include="System.Text.Encodings.Web" Version="6.0.1" />
这样直接锁定安全版本,避免依赖过时的旧版本。
步骤3:调整迁移扩展方法(确保编译正常)
你的扩展方法中scope变量未定义,补全后代码如下(.NET 6中可直接使用IWebHost,无需额外引用):
using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; public static IWebHost MigrateDbContext<TContext>(this IWebHost webHost, Action<TContext, IServiceProvider> seeder) where TContext : DbContext { using var scope = webHost.Services.CreateScope(); var services = scope.ServiceProvider; var logger = services.GetRequiredService<ILogger<TContext>>(); var context = services.GetService<TContext>(); try { logger.LogInformation("开始迁移数据库(上下文:{ContextName})", typeof(TContext).Name); context.Database.Migrate(); seeder?.Invoke(context, services); logger.LogInformation("数据库迁移完成"); } catch (Exception ex) { logger.LogError(ex, "迁移数据库时出错(上下文:{ContextName})", typeof(TContext).Name); throw; } return webHost; }
原理说明
- .NET 6的ASP.NET Core共享框架已整合了原
Microsoft.AspNetCore.Hosting.Abstractions中的核心类型(如IWebHost),无需单独引用旧版包。 - 旧版包的传递依赖会引入有漏洞的
System.Text.Encodings.Web4.5.0,移除旧包后显式指定新版本即可解决安全警告。 - 调整后的扩展方法直接使用框架内置的
IWebHost,编译和运行都能正常工作。
内容的提问来源于stack exchange,提问作者Mihai Socaciu
相关产品推荐
相关产品推荐

