.Net Core 3.0很快就要出正式版了,纸壳CMS也在第一时间进行了更新升级,在升级的过程中也遇到了一些问题在这里和大家分享一下。

项目文件变化

最大的变化应该是Asp.NetCore在3.0中作为将框架,引用时也将作为框架进行引用。

之前是单个的包引用,像这样:

<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
......

3.0将作为框架进行引用:

<ItemGroup>
  <FrameworkReference Include="Microsoft.AspNetCore.App"></FrameworkReference>
</ItemGroup>

因此,TargetFramework也产生了变化,原先是netstandard2.0现在要变成netcoreapp3.0

<TargetFramework>netcoreapp3.0</TargetFramework>

在开始升级的时候,并不知道这样的变化,然后还在GitHub上进行了提问:

https://github.com/aspnet/AspNetCore/issues/10726

IWebHostBuilder

IWebHostBuilder变更为IHostBuilder,使用Host来创建WebHost:

namespace ZKEACMS.WebHost
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateWebHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    webBuilder.ConfigureLogging((hostingContext, logging) =>
                    {
                        logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                        logging.AddConsole();
                        logging.AddDebug();
                        logging.AddEventSourceLogger();
                    });
                });
    }
}

IHostingEnvironment

IHostingEnvironment变更为IWebHostEnvironment

Endpoints路由注册变化

使用新的方法进行Endpoints路由的注册:

applicationBuilder.UseRouting();
applicationBuilder.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute()
    endpoints.MapRazorPages();
});

Razor动态编译

.Net Core 3.0的Razor的动态编译需要通过添加Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation包引用来开启:

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" />
</ItemGroup>

然后通过调用AddRazorRuntimeCompilation方法来启用:

services
    .AddControllersWithViews()
    .AddRazorRuntimeCompilation();

纸壳CMS采用预编译和动态编译的混合模式。主题目录~/wwwroot/themes下的视图不会被预编译以方便在线修改。

插件变化

纸壳CMS的插件项目类型更改为:Microsoft.NET.Sdk.Razor

<Project Sdk="Microsoft.NET.Sdk.Razor">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
  </PropertyGroup>
  
  <ItemGroup>
    <ProjectReference Include="..\ZKEACMS\ZKEACMS.csproj" />
  </ItemGroup>
</Project>