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

Posted

技术标签:

【中文标题】如何将 .NET Core 2.2 Web API 迁移到 .NET Core 3.0?【英文标题】:How do I migrate .NET Core 2.2 Web API to .NET Core 3.0? 【发布时间】:2020-01-26 14:11:54 【问题描述】:

我关注了Microsoft's migration guide,但失败了。因此,我使用 .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”集 'MvcOptions.EnableEndpointRouting = false' 里面 '配置服务(...)。在 Microsoft.AspNetCore.Builder.MvcApplicationBuilderExtensions.UseMvc(IApplicationBuilder 应用程序,Action'1 配置路由)在 Microsoft.AspNetCore.Builder.MvcApplicationBuilderExtensions.UseMvc(IApplicationBuilder 应用程序)在 netmig.Startup.Configure(IApplicationBuilder 应用程序, IHostingEnvironment env) 在 E:\testapp\netmig\Startup.cs:line 46 at System.RuntimeMethodHandle.InvokeMethod(对象目标,对象 [] 参数、签名 sig、布尔构造函数、布尔 wrapExceptions) 在 System.Reflection.RuntimeMethodInfo.Invoke(对象 obj,BindingFlags invokeAttr、Binder binder、Object[] 参数、CultureInfo 文化) 在 Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(对象 例如,IApplicationBuilder 构建器)在 Microsoft.AspNetCore.Hosting.ConfigureBuilder.c__DisplayClass4_0.b__0(IApplicationBuilder 建设者)在 Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.c__DisplayClass13_0.b__2(IApplicationBuilder 应用程序)在 Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder 建设者)在 Microsoft.AspNetCore.HostFilteringStartupFilter.c__DisplayClass0_0.b__0(IApplicationBuilder 应用程序)在 Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancelToken) 未处理的异常。 System.InvalidOperationException:端点路由不支持 'IApplicationBuilder.UseMvc(...)'。使用“IApplicationBuilder.UseMvc” 在里面设置'MvcOptions.EnableEndpointRouting = false' '配置服务(...)。在 Microsoft.AspNetCore.Builder.MvcApplicationBuilderExtensions.UseMvc(IApplicationBuilder 应用程序,Action'1 配置路由)在 Microsoft.AspNetCore.Builder.MvcApplicationBuilderExtensions.UseMvc(IApplicationBuilder 应用程序)在 netmig.Startup.Configure(IApplicationBuilder 应用程序, IHostingEnvironment env) 在 E:\testapp\netmig\Startup.cs:line 46 at System.RuntimeMethodHandle.InvokeMethod(对象目标,对象 [] 参数、签名 sig、布尔构造函数、布尔 wrapExceptions) 在 System.Reflection.RuntimeMethodInfo.Invoke(对象 obj,BindingFlags invokeAttr、Binder binder、Object[] 参数、CultureInfo 文化) 在 Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(对象 例如,IApplicationBuilder 构建器)在 Microsoft.AspNetCore.Hosting.ConfigureBuilder.c__DisplayClass4_0.b__0(IApplicationBuilder 建设者)在 Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.c__DisplayClass13_0.b__2(IApplicationBuilder 应用程序)在 Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder 建设者)在 Microsoft.AspNetCore.HostFilteringStartupFilter.c__DisplayClass0_0.b__0(IApplicationBuilder 应用程序)在 Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken 取消令牌)在 Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken 取消令牌)在 Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost 主机,CancellationToken 令牌)在 Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost 主机,CancellationToken 令牌)在 Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost 主机)在 netmig.Program.Main(String[] args) 中 E:\testapp\netmig\Program.cs:line 18 watch : 退出并出现错误代码 -532462766

The full code I am running can be found on 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 文件\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 3.0.0 [C:\Program 文件\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 文件\dotnet\shared\Microsoft.NETCore.App] Microsoft.WindowsDesktop.App 3.0.0 [C:\Program 文件\dotnet\shared\Microsoft.WindowsDesktop.App]

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

【问题讨论】:

该错误看起来与中间件配置有关。检查此部分:docs.microsoft.com/en-us/aspnet/core/migration/… 当您更改 Net 版本时,您始终必须进行干净的构建才能正确地将代码编译到编译器。 @jdweng 我之前做了 dotnet clean 和 dotnet restore 之后。我应该卸载 2.2 来完成这项工作吗? 您可以安装多个版本的网络。您可以使用带有 Net Core 2.0 的 VS2018 和带有 Net Core 3.0 的 VS2019。问题是当 Net 更改时编译器依赖项不起作用。您不能让项目上的 obj 文件混合不同版本的 Net。如果您更新到 Net Core 3.0,则所有 obj 文件都需要使用 Net Core 3.0 进行编译。 【参考方案1】:

对于 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>

【讨论】:

我试过这个,但似乎在我的 vscode 中链接到 netcore2.2 的项目,我无法获得 services.AddControllers() IWebHostEnvironment 也无法识别。 您仍然可以使用AddMvc()UseMvc()AddControllers()UseEndpoints()等新方法。只是如果你想更细化

以上是关于如何将 .NET Core 2.2 Web API 迁移到 .NET Core 3.0?的主要内容,如果未能解决你的问题,请参考以下文章

如何测试返回 Ok(object) 的 ASP.NET Core 2.2 Web API GET IActionResult?

将项目从 2.2 更新到 3.1(缺少程序集)或如何在 .NET Core 中使用 API POST 请求时,PostAsJsonAsync()在 .Net Core 3.1 中不起作用 [重复]

无法从 NET Core 2.2 Web API 连接到 docker sql server

使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

本地 Javascript Fetch Post 请求失败,调用 ASP.NET Core 2.2 Web API。 CORS 已启用

如何将 .net core Web API 项目添加到现有的 .NET core (3.1) Web Application 项目中?