Ken的杂谈从ASP.NET Core 2.1迁移到3.1

2020-01-20 16:43:31 浏览数 (1)

一、前言

Ken的杂谈从2017年就开始采用 .NET Core作为开发框架,当时用的还是 .NET Core 2.0。 随后,.NET Core 2.1(LTS) 在2018年发布,Ken的杂谈又紧跟版本升级到 .NET Core 2.1 后面.NET Core3.0发布,但不是LTS版本,再加上我又懒,所以就干脆等到 .NET Core 3.1(LTS)正式发布,才来升级。毕竟这也是 .NET Core的最后一个主版本,下一个版本就是大一统的 .NET 5了。

由于跨了3个版本,会出现跟官方的迁移文章不一样的情况,所以也简单记录一下

二、升级过程

1、修改Project目标框架

修改 .csproj文件,把目标框架从netcoreapp2.1修改为netcoreapp3.1

代码语言:javascript复制
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <PropertyGroup>
        <!--<TargetFramework>netcoreapp2.1</TargetFramework>-->
        <TargetFramework>netcoreapp3.1</TargetFramework>
    </PropertyGroup>
  </PropertyGroup>

</Project>

2、升级依赖的NuGet包

将项目依赖的所有NuGet包更新至最新版本

代码语言:javascript复制
update-package <package_name>

当然,你可以用IDE提供的界面进行操作,更加便捷

3、修改MVC注册方式

ASP.NET Core 3.0以后,提供了新的MVC服务注册方式,更加灵活

  • ASP.NET Core 2.x
代码语言:javascript复制
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
}
  • ASP.NET Core 3.x
代码语言:javascript复制
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
}

如果你用的Razor Pages

那就是:

代码语言:javascript复制
public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
}

4、修改路由启动方式

ASP.NET Core 3.0 中推荐使用端点路由(Endpoint Routing) 端点路由是 ASP.NET Core 2.2 引入,到3.1已经成熟稳定了。 引入端点路由主要是为了为不同的服务统一提供路由功能,例如:MVC,Razor Pages,Blazor,Signal

  • ASP.NET Core 2.1 路由启动
代码语言:javascript复制
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //...
    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}"
        );
    });
}
  • ASP.NET Core 3.1 路由启动
代码语言:javascript复制
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //...
    app.UseStaticFiles();

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });

}

5、UrlHelper创建方式兼容

由于 ASP.NET Core 2.2 之后,启动路由有两种方式,如果直接使用 new UrlHelper()的方式会出现Exception,需要修改为通过UrlHelperFactory来构建。

代码语言:javascript复制
//    var url = new UrlHelper
//        (
//        new ActionContext
//            (
//            ViewContext.HttpContext,
//            ViewContext.RouteData,
//            ViewContext.ActionDescriptor
//            )
//        );
var url = new UrlHelperFactory().GetUrlHelper
    (
        new ActionContext
            (
            ViewContext.HttpContext,
            ViewContext.RouteData,
            ViewContext.ActionDescriptor
            )
    );

三、备注

1、其他可能会碰到的问题

做完以上修改,建议关闭解决方案,然后删除IDE的项目配置目录,例如: .vs,.vscode,.idea ,然后重启项目。

不然项目的编译上可能会碰到问题。

另外,项目发布到文件夹时,也建议保证目标文件夹为空,不然发布时也有可能碰到问题:

Microsoft.NET.Sdk.Publish.TransformFiles.targets(50,5): error MSB4018: The “TransformWebConfig” task failed unexpectedly. System.Exception: In process hosting is not supported for AspNetCoreModule. Change the AspNetCoreModule to at least AspNetCoreModuleV2.

这个问题是发布时,IDE错误的将要发布的Project识别为 ASP.NET Core 2.x的项目。只要保证发布的目标文件夹为空即可。

2、附录

  • https://docs.microsoft.com/zh-cn/aspnet/core/migration/30-to-31
  • https://docs.microsoft.com/zh-cn/aspnet/core/migration/22-to-30
  • https://docs.microsoft.com/zh-cn/aspnet/core/migration/21-to-22

0 人点赞