如何将.NET Core 2.2 Web API迁移到.NET Core 3.0?

3
我一开始是按照微软的迁移指南进行迁移,但失败了。于是我创建了一个.NET 2.2的新项目以建立干净的模板,然后尝试迁移到.NET Core 3.0。但又一次失败了。在Startup.cs中,依赖注入找不到services.AddMvc()方法。
看起来我的代码仍然引用的是.NET 2.2而不是.NET 3.0。
如果我运行dotnet watch run,会得到以下错误消息:
应用程序启动异常System.InvalidOperationException: 终结点路由不支持 'IApplicationBuilder.UseMvc(...)'. 若要使用 'IApplicationBuilder.UseMvc',请在 'ConfigureServices(...)' 中设置 'MvcOptions.EnableEndpointRouting = false'。在 E:\testapp\netmig\Startup.cs 的第46行中,在Microsoft.AspNetCore.Builder.MvcApplicationBuilderExtensions.UseMvc(IApplicationBuilder app, Action'1 configureRoutes)处和Microsoft.AspNetCore.Builder.MvcApplicationBuilderExtensions.UseMvc(IApplicationBuilder app)处。在Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)处和Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder)处和Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.b__2(IApplicationBuilder app)处和Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)处和Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app)处抛出未处理的异常。 System.InvalidOperationException:终结点路由不支持'IApplicationBuilder.UseMvc(...)'。要使用'IApplicationBuilder.UseMvc',请在'ConfigureServices(...)'中设置'MvcOptions.EnableEndpointRouting = false'。在E:\ testapp \ netmig \ Startup.cs的第46行,在Microsoft.AspNetCore.Builder.MvcApplicationBuilderExtensions.UseMvc(IApplicationBuilder app,Action'1 configureRoutes)处和Microsoft.AspNetCore.Builder.MvcApplicationBuilderExtensions.UseMvc(IApplicationBuilder app)处。在Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance,IApplicationBuilder builder)处和Microsoft.AspNetCore.Hosting.ConfigureBuilder。< > c__DisplayClass4_0.b__0(IApplicationBuilder builder)处和Microsoft.AspNetCore.Hosting.GenericWebHostBuilder。< > c__DisplayClass13_0.b__2(IApplicationBuilder app)处和Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter。< > c__DisplayClass0_0.g__MiddlewareFilterBuilder | 0(IApplicationBuilder builder)处和Microsoft.AspNetCore.HostFilteringStartupFilter。< > c__DisplayClass0_0.b__0(IApplicationBuilder app)处抛出未处理的异常。在Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)处和Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken)处和Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host,CancellationToken token)处和Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host,CancellationToken token)处和Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host)处和E:\ testapp \ netmig \ Program.cs的netmig.Program.Main(String[] args)的第18行。watch:以错误代码-532462766退出

我运行的完整代码可以在GitHub上找到。我的.NET信息:

dotnet --info .NET Core SDK(反映任何global.json):版本:
3.0.100 提交: 04339c3a26

运行时环境: 操作系统名称: Windows 操作系统版本: 10.0.18362 操作系统平台:Windows RID: win10-x64 基本路径: C:\Program Files\dotnet\sdk\3.0.100\

主机(用于支持): 版本:3.0.0 提交: 7d57652f33

已安装的.NET Core SDK: 2.2.401 [C:\Program Files\dotnet\sdk] 3.0.100 [C:\Program Files\dotnet\sdk]

已安装的.NET Core运行时: Microsoft.AspNetCore.All 2.2.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.App 2.2.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.0.0 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.NETCore.App 2.2.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 3.0.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 3.0.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

要安装其他.NET Core运行时或SDK:
https://aka.ms/dotnet-download


当你更改Net的版本时,你总是需要进行彻底构建(clean build)才能使代码正确编译。 - jdweng
@jdweng 在此之前我执行了 dotnet clean,然后执行了 dotnet restore。我应该卸载2.2版本来解决这个问题吗? - nightingale2k1
你可以安装多个版本的.NET。例如,你可以同时安装VS2018带有.NET Core 2.0和VS2019带有.NET Core 3.0。但问题是编译器的依赖关系在.NET更改时会出现问题。项目中的obj文件不能混合不同版本的.NET。如果你升级到.NET Core 3.0,所有的obj文件都需要使用.NET Core 3.0重新编译。 - jdweng
1个回答

12

对于v2.2版本

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMvc();
    }

对于v3版本

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

同时确保你的 csproj 目标为 .net core 3.0。

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

我尝试了这个,但似乎该项目链接到 netcore2.2在我的 vscode 中,我无法获取 services.AddControllers()IWebHostEnvironment 也未被识别。 - nightingale2k1
你仍然可以使用 AddMvc()UseMvc()。新的方法如 AddControllers()UseEndpoints() 等只是为了更加细粒度化。 - Chris Pratt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接