Net6Net 5.0迁移到Net 6.0
Posted 厦门德仔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Net6Net 5.0迁移到Net 6.0相关的知识,希望对你有一定的参考价值。
Net 5.0迁移到Net 6.0
NET 5将于2022 年 5 月 8 日终止支持,是时候升级到.NET 6 LTS
.NET 5.0 将于 2022 年 5 月 8 日终止支持。在 .NET 5 月更新之后,Microsoft 将不再为 .NET 5.0 提供服务更新,包括安全修补程序或技术支持。在此日期之前,您需要将您使用的 .NET 版本更新为受支持的版本 (.NET 6.0),以便继续接收更新。
在 global.json 中更新 .NET SDK 版本
如果依靠 global.json 文件来面向特定 .NET SDK 版本,请将 version 属性更新为已安装的 .NET 6.0 SDK 版本。 例如
"sdk":
- "version": "5.0.100"
+ "version": "6.0.100"
更新目标框架
-
手工修改
-
修改proj 文件
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
- <TargetFramework>net5.0</TargetFramework>
+ <TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
</Project>
更新包引用
在项目文件中,将每个 Microsoft.AspNetCore.* 和 Microsoft.Extensions.* 包引用的 Version 特性更新为 6.0.0 或更高版本。 例如:
<ItemGroup>
- <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="5.0.3" />
- <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="5.0.0" />
+ <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="6.0.0" />
+ <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="6.0.0" />
</ItemGroup>
nuget 批量更新
新托管模型
适用于 ASP.NET Core 的新的 .NET 6 最小托管模型只需要一个文件和几行代码。 迁移到 6.0 的应用不需要使用新的最小托管模型。 有关详细信息,请参阅以下部分中的迁移到 6.0 的应用不需要使用新的最小托管模型。
ASP.NET Core 空模板中的以下代码使用新的最小托管模型创建应用:
C#
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
最小托管模型:
显著减少创建应用所需的文件和代码行数。 只需要一个文件和四行代码。
将 Startup.cs 和 Program.cs 统一到单个 Program.cs 文件中。
使用顶级语句最大程度减少应用所需的代码。
使用全局 指令消除或最大程度减少所需的 语句行数。
以下代码显示 ASP.NET Core 5 Web 应用模板 (Razor Pages) 中的 Startup.cs 和 Program.cs 文件,其中删除了未使用的 using 语句:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
// Unused usings removed.
namespace WebAppRPv5
public class Startup
public Startup(IConfiguration configuration)
Configuration = configuration;
public IConfiguration Configuration get;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
services.AddRazorPages();
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
endpoints.MapRazorPages();
);
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
// Unused usings removed.
namespace WebAppRPv5
public class Program
public static void Main(string[] args)
CreateHostBuilder(args).Build().Run();
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
webBuilder.UseStartup<Startup>();
);
在 ASP.NET Core 6 中,上面的代码替换为以下内容:
C#
复制
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
上面的 ASP.NET Core 6 示例演示了以下操作方式:
ConfigureServices 替换为 WebApplication.Services。
builder.Build() 将配置的 WebApplication 返回到变量 app。 Configure 会替换为对使用 app 的相同服务的配置调用。
本文档后面会提供使用最小托管模型将 ASP.NET Core 5 Startup 代码迁移到 ASP.NET Core 6 的详细示例。
对为 Web 应用模板生成的其他文件进行了几处更改:
Index.cshtml 和 Privacy.cshtml 删除了未使用的 using 语句。
Error.cshtml 中的 RequestId 声明为空引用类型 (NRT):
- public string RequestId get; set;
+ public string? RequestId get; set;
日志级别默认值已更改, appsettings.json 并且 appsettings.Development.json:
diff
- "Microsoft": "Warning",
- "Microsoft.Hosting.Lifetime": "Information"
+ "Microsoft.AspNetCore": "Warning"
在前面的 ASP.NET Core模板代码中,“Microsoft”: "Warning"已更改为 “Microsoft.AspNetCore”: “Warning”。 此更改会导致记录 Microsoft 命名空间中的所有信息性消息, 但除外Microsoft.AspNetCore。 例如,Microsoft.EntityFrameworkCore 现记录在信息级别。
有关新托管模型的更多详细信息,请参阅常见问题解答部分。 有关采用 NRT 和 .NET 编译器 Null 状态分析的详细信息,请参阅空引用类型 (NRT) 和 .NET 编译器 Null 状态静态分析部分。
那就简单演示一下:
Web项目的修改:
原Program.cs和startup.cs
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ZettlercnMIS.WebUI
public class Program
public static void Main(string[] args)
CreateHostBuilder(args).Build().Run();
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
//webBuilder.ConfigureKestrel((context, options) =>
//
// //设置Body大小限制256MB
// options.Limits.MaxRequestBodySize = 268435456;
//);
webBuilder.UseStartup<Startup>();
); //.UseServiceProviderFactory(new AutofacServiceProviderFactory())
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json.Serialization;
using System.Text.Encodings.Web;
using System.Text.Unicode;
using ZettlercnMIS.Interface;
using ZettlercnMIS.Service;
using ZettlercnMIS.WebUI.Utility;
using ZettlercnMIS.WebUI.Utility.Filters;
namespace ZettlercnMIS.WebUI
public class Startup
public Startup(IConfiguration configuration)
Configuration = configuration;
public IConfiguration Configuration get;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
#region ViewBag/ViewData中文编码问题
services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All));
#endregion
services.AddHttpContextAccessor();
#region 支持Filter依赖注入
//services.AddScoped<PermissionActionFilterAttribute>();
#endregion
#region IOC注册抽象和具体的依赖关系
services.AddSingleton<ISysMenuService, SysMenuService>(); //用户动作
services.AddScoped<ISysLogExService, SysLogExService>(); //异常日志
services.AddScoped<ISysLogVisService, SysLogVisService>(); //日志访问
services.AddScoped<ILogHandler, LogHandler>(); //操作日志处理
services.AddScoped<ISysLogOpService, SysLogOpService>(); //操作日志
//services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddScoped<ImyUserManager,myUserManager>(); //用户信息
#endregion
#region 增加Cookie中间件配置
services.AddAuthentication(options =>
options.DefaultAuthenticateScheme = "MyCookieAuthenticationScheme";
options.DefaultChallengeScheme = "MyCookieAuthenticationScheme";
options.DefaultSignInScheme = "MyCookieAuthenticationScheme";
)
.AddCookie("MyCookieAuthenticationScheme", options =>
options.LoginPath = "/Login/Index";
);
#endregion
#region 全局注册:包含MVC+api
services.AddControllersWithViews(option =>
//授权过滤器
option.Filters.Add<PermissionActionFilterAttribute>();
).AddRazorRuntimeCompilation();//视图修改 热重载
#endregion
services.AddMvc(option =>
//异常过滤器
option.Filters.Add<GlobalExceptionFilterAttribute>();
//授权过滤器
option.Filters.Add<PermissionActionFilterAttribute>();
//日志过滤器
option.Filters.Add<LogActionFilter>();
);
//Session配置
services.AddSession();
#region 配置表单上传大小和URL
services.Configure<FormOptions>(x =>
x.ValueLengthLimit = int.MaxValue;
// 设置上传大小限制256MB
x.MultipartBodyLengthLimit = 1024*1024*1024;//268435456
x.MultipartHeadersLengthLimit = int.MaxValue;
);
#endregion
services.AddControllers().AddNewtonsoftJson();
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
app.UseExceptionHandler("/Home/Error");
app.UseStaticFiles();
//自定义自己的文件路径,例如提供访问D盘下的Study目录,
//http://localhost:52723/MyStudy/README.md将访问D盘的Study目录中的README.md文件
//app.UseStaticFiles(new StaticFileOptions()
//
// FileProvider = new PhysicalFileProvider(@"D:\\UploadFile"),//指定实际物理路径
// RequestPath = new PathString("/UploadFile")//对外的访问路径
//);
app.UseSession();
app.UseRouting();
app.UseAuthentication();//认证
app.UseAuthorization(); //授权
app.UseEndpoints(endpoints =>
endpoints.MapControllerRoute(
name: "default",
//pattern: "controller=SysVideo/action=ViewSysOrgChart/id?");
pattern: "controller=Login/action=Index/id?");
);
合并到Program.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Text.Encodings.Web;
using System.Text.Unicode;
using ZettlercnMIS.Interface;
using ZettlercnMIS.Service;
using ZettlercnMIS.WebUI.Utility;
using ZettlercnMIS.WebUI.Utility.Filters;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
#region ViewBag/ViewData中文编码问题
builder.Services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All));
#endregion
builder.Services.AddHttpContextAccessor();
#region IOC注册抽象和具体的依赖关系
builder.Services.AddSingleton<ISysMenuService, SysMenuService>(); //用户动作
builder.Services.AddScoped<ISysLogExService, SysLogExService>(); //异常日志
builder.Services.AddScoped<ISysLogVisService, SysLogVisService>(); //日志访问
builder.Services.AddScoped<ILogHandler, LogHandler>(); //操作日志处理
builder.Services.AddScoped<ISysLogOpService, SysLogOpService>(); //操作日志
//services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddScoped<ImyUserManager, myUserManager>(); //用户信息
#endregion
#region 增加Cookie中间件配置
builder.Services.AddAuthentication(options =>
options.DefaultAuthenticateScheme = "MyCookieAuthenticationScheme";
options.DefaultChallengeScheme = "MyCookieAuthenticationScheme";
options.DefaultSignInScheme = "MyCookieAuthenticationScheme";
)
.AddCookie("MyCookieAuthenticationScheme", options =>
options.LoginPath = "/Login/Index";
);
#endregion
#region 全局注册:包含MVC+api
builder.Services.AddControllersWithViews(option =>
//授权过滤器
option.Filters.Add<PermissionActionFilterAttribute>();
.NET 5.0即将不再提供服务更新,请升级到.NET 6.0
将 ASP.NET Core 5.0 IdentityServer4 升级到 6.0 错误 - 没有这样的表:键
发布时迁移到 .NET 6.0 错误:资产文件没有“net5.0”的目标
如何将 Azure Functions v3 迁移到 .net core 5.0