Ken的杂谈
  • Ken的杂谈 (current)
  • 关于
  • 杂谈
    Java Spring Spring Boot Spring Cloud MyBatis C# .NET Core .NET ASP.NET Core ASP.NET ClassLibrary Mono 数据库 MySQL SQL Server 网络 缓存 Web Linux CentOS Ubuntu macOS Nginx Windows ServiceStack JS/JQ 正则 工具 IDE Grafana Exceptions CI/CD Solution 微服务 Arch Docker 杂谈
  • 系列
    Java 快速入门系列教程 Spring Boot 入门教程 Spring Boot 2.x 入门教程 Spring Cloud 入门教程 .NET Core 快速入门教程 ASP.NET Core 2.1 入门教程 CentOS 7 快速上手教程 Ubuntu快速上手入门教程 Hyper-V基础教程 Docker入门教程
  • GitHub

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

.NET Core ASP.NET Core 杂谈 @ 2019-12-10 00:06:16 · 阅读:(5757)

一、前言

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

<Project Sdk="Microsoft.NET.Sdk.Web">

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

</Project>

2、升级依赖的NuGet包

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

update-package <package_name>

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

3、修改MVC注册方式

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

  • ASP.NET Core 2.x
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
}
  • ASP.NET Core 3.x
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
}

如果你用的Razor Pages

那就是:

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 路由启动
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 路由启动
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来构建。

//    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

Ken的杂谈

本文由 ken.io 创作,采用CC BY 3.0 CN协议 进行许可。 可自由转载、引用、甚至修改,但需署名作者且注明出处。

.NET Core ASP.NET Core 杂谈

随笔目录


    © Copyright 2012-2023 Ken的杂谈

    豫ICP备10025012号-1

    ASP.NET Core(6.0) on Linux