一、前言
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的项目。只要保证发布的目标文件夹为空即可。