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"
  

更新目标框架

  1. 手工修改

  2. 修改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

IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述

路遥工具箱全面迁移至 .NET 6.0 并发布 3.0 版本及迁移记录详解