一、WebApi
1、Swagger的一个小坑(升级Swashbuckle.AspNetCore  4.0.1=>5.2.1)

.Net Core2.2  Startup.cs
 //注册Swagger生成器,定义一个和多个Swagger 文档 services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Info { Title = "API接口", Description = "接口", Version = "v1" }); // 为 Swagger JSON and UI设置xml文档注释路径 var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//获取应用程序所在目录(绝对,不受工作目录影响,建议采用此方法获取路径) var xmlPath = Path.Combine(basePath, "xxx.xml"); c.IncludeXmlComments(xmlPath); });
.Net Core3.1  Startup.cs
 //注册Swagger生成器,定义一个和多个Swagger 文档 services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "API接口", Description = "接口", Version = "v1" }); // 为 Swagger JSON and UI设置xml文档注释路径 var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//获取应用程序所在目录(绝对,不受工作目录影响,建议采用此方法获取路径) var xmlPath = Path.Combine(basePath, "xxx.xml"); c.IncludeXmlComments(xmlPath); });

2、Json格式设置的坑

.Net Core2.2  Startup.cs
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddControllersAsServices().AddJsonOptions
            (
                json =>
                {
                    //统一设置JsonResult
                    json.SerializerSettings.ContractResolver = new DefaultContractResolver();
                    json.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
                }
            );
.Net Core3.1 Startup.cs
添加包 Microsoft.AspNetCore.Mvc.NewtonsoftJson services.AddMvc(option
=> { option.EnableEndpointRouting = false; }).SetCompatibilityVersion(CompatibilityVersion.Version_3_0).AddControllersAsServices().AddNewtonsoftJson ( json => { //统一设置JsonResult json.SerializerSettings.ContractResolver = new DefaultContractResolver(); json.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; } );

二、Web

1、AddMvc的坑

.Net Core2.2
services.AddMvc(option =>
            {
                option.Filters.Add<IdentityAuthorizeFilter>();
                option.Filters.Add<ExceptionFillters>();
            });
.Net Core3.1
services.AddControllersWithViews(option => {
                option.Filters.Add<IdentityAuthorizeFilter>();
                option.Filters.Add<ExceptionFillters>();
            });

2、Autofac的坑,.net core3.1不支持IServiceProvider

.Net Core2.2 Startup.cs
public IServiceProvider ConfigureServices(IServiceCollection services)
        {
           #region 其他设置
           #endregion

            var builder = new ContainerBuilder();
            builder.Populate(services);

            //告诉autofac框架注册Service层所在程序集中的所有类的对象实例到IService层所在程序集中的所有类的对象实例
            Assembly iserAss = Assembly.Load("CBest.AFS.Interface");
            Assembly serAss = Assembly.Load("CBest.AFS.Service");
            //创建serAss中的所有类的instance以此类的实现接口存储
            builder.RegisterAssemblyTypes(iserAss, serAss).AsImplementedInterfaces().PropertiesAutowired();//支持构造方式注入和属性方式注入,不加PropertiesAutowired则只支持构造方式

            //注入到控制器
            var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
                .Where(type => typeof(Controller).IsAssignableFrom(type)).ToArray();
            builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
            //创建一个Autofac的容器
            var container = builder.Build();
            return new AutofacServiceProvider(container);
}    

 

.Net Core3.1 Startup.cs中新增以下方法
//依赖注入
        public void ConfigureContainer(ContainerBuilder builder)
        {
            Assembly iserAss = Assembly.Load("XXX.Interface");
            Assembly serAss = Assembly.Load("XXX.Service");
            //创建serAss中的所有类的instance以此类的实现接口存储
            builder.RegisterAssemblyTypes(iserAss, serAss).AsImplementedInterfaces().PropertiesAutowired();//支持构造方式注入和属性方式注入,不加PropertiesAutowired则只支持构造方式

            //注入到控制器
            var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
                .Where(type => typeof(Controller).IsAssignableFrom(type)).ToArray();
            builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
        }

3、授权和身份认证的坑

.Net Core2.2  Program.cs
public static void Main(string[] args)
        {
            NLogBuilder.ConfigureNLog("nlog.config");

            CreateWebHostBuilder(args).UseUrls("http://*:8011").Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                   .UseStartup<Startup>();
.Net Core3.1 Program.cs
public static void Main(string[] args)
        {
            NLogBuilder.ConfigureNLog("nlog.config");
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>().UseUrls("http://*:8011");
                });
.Net Core2.2 Startup.cs Configure函数
app.UseAuthentication()
app.UseMvc(routes => routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}"));
.Net Core3.1 Startup.cs Configure函数
app.UseAuthorization();
app.UseAuthentication();
app.UseRouting(); app.UseEndpoints(endpoints
=> { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
.Net Core2.2 
await HttpContext.SignInAsync(pricipal);
.Net Core3.1
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, pricipal);

  await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, pricipal, new AuthenticationProperties()
  {
    IsPersistent = true,//是否持久化
    ExpiresUtc = DateTimeOffset.UtcNow.AddHours(12),//过期时间设置
    AllowRefresh = true //是否允许刷新??
  });