从 .NET Core 2.1 降级到 .NET 4.7.1 时如何使用 IApplicationBuilder 和 IServiceCollection?

Posted

技术标签:

【中文标题】从 .NET Core 2.1 降级到 .NET 4.7.1 时如何使用 IApplicationBuilder 和 IServiceCollection?【英文标题】:How to use IApplicationBuilder and IServiceCollection when downgrading from .NET Core 2.1 to .NET 4.7.1? 【发布时间】:2019-01-04 06:53:50 【问题描述】:

我不得不将我的项目从 .NET Core 2.1 更改为 .NET 4.7.1,并且我修复了几乎所有错误,除了以下仍然无法解决的错误

“IApplicationBuilder”不包含“UseHsts”的定义,并且找不到接受“IApplicationBuilder”类型的第一个参数的扩展方法“UseHsts”(您是否缺少 using 指令或程序集引用?)

“IApplicationBuilder”不包含“UseAuthentication”的定义,并且找不到接受“IApplicationBuilder”类型的第一个参数的扩展方法“UseAuthentication”(您是否缺少 using 指令或程序集引用?)

“IApplicationBuilder”不包含“UseCookiePolicy”的定义,并且找不到接受“IApplicationBuilder”类型的第一个参数的扩展方法“UseCookiePolicy”(您是否缺少 using 指令或程序集引用?)

“IApplicationBuilder”不包含“UseHttpsRedirection”的定义,并且找不到接受“IApplicationBuilder”类型的第一个参数的扩展方法“UseHttpsRedirection”(您是否缺少 using 指令或程序集引用?)

“IApplicationBuilder”不包含“UseSession”的定义,并且找不到接受“IApplicationBuilder”类型的第一个参数的扩展方法“UseSession”(您是否缺少 using 指令或程序集引用?)

“IApplicationBuilder”不包含“UseStaticFiles”的定义,并且找不到接受“IApplicationBuilder”类型的第一个参数的扩展方法“UseStaticFiles”(您是否缺少 using 指令或程序集引用?)

“IServiceCollection”不包含“AddAuthentication”的定义,并且找不到接受“IServiceCollection”类型的第一个参数的扩展方法“AddAuthentication”(您是否缺少 using 指令或程序集引用?)

“IServiceCollection”不包含“AddSession”的定义,并且找不到接受“IServiceCollection”类型的第一个参数的扩展方法“AddSession”(您是否缺少 using 指令或程序集引用?)

我正在使用Microsoft.AspNetCore.BuilderMicrosoft.Extensions.DependencyInjection。我还需要使用/安装/添加什么来让IApplicationBuilderIServiceCollection 工作?

在我的 WebApi.csproj 文件中,我将目标框架从 netcoreapp2.1 更改为 net471。

旧:

<PropertyGroup>
  <TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>

新:

<PropertyGroup>
  <TargetFramework>net471</TargetFramework>
</PropertyGroup>

【问题讨论】:

只是好奇——我有几个基于 net-core-2.1 的项目(实际上,它们大多是 net-standard-2.0,入口点程序集是 net-core-2.1)并运行net-4.7.1 上的窗口。为什么必须将其“向下”移植?你不能只运行它们吗? “net core app”只是一堆打包成nugets的dll,不比newtonsoft.json / etc更特别,在net471上运行应该没有任何问题。如果尺寸很重要(netcoreapp 非常大),您可以跳过“全部”组装并手动选择特定的组装并减少几次重量。那么您的问题是什么? @Friso 这些包是 .NET Standard 2.0,因此它们可以在完整的框架中使用。您可能应该将您的代码移至 .NET Standard 库,只将必要的配置留给特定于运行时的项目。 @Friso btw ASP.NET Core 本身并不绑定到 .NET Core。您也可以通过在创建 Web 应用项目时选择适当的运行时将其用于完整框架站点。也许您也可以在 csproj 文件中将 netcoreapp2.0 更改为 net471。我在类库、控制台项目中使用了很多,但在 ASP.NET Core 项目中还没有 我正在尝试从 .NET Core 3.1 到 .NET 4.7.2。如何替换 Program.cs 文件中的 HostBuilder.CreateDefaultBuilder ? 【参考方案1】:

按照 Rik 的回答,我搜索了更多包,发现我必须添加以下所有 NuGet 包:

Microsoft.AspNetCore.Authentication Microsoft.AspNetCore.Session Microsoft.AspNetCore.HttpsPolicy Microsoft.AspNetCore.CookiePolicy Microsoft.AspNetCore.StaticFiles

执行此操作后,我不再收到错误消息。

【讨论】:

【参考方案2】:

可以使用以下 nuget 包修复“AddSession”和“UseAuthentication”错误。

Microsoft.AspNetCore.Session Microsoft.AspNetCore.Authentication

【讨论】:

【参考方案3】:

首先,切换到 4.7.1 并不是降级,而是迁移到不同的平台。您可能不需要做的事情,除非您想将代码重用于 Winforms 或 WPF 应用程序。

Microsoft.Extensions.* 包面向 .NET Standard 2.0,而不仅仅是 Core,因此您也可以在完整框架中使用它们。

包和类也不与 ASP.NET 绑定,托管除外。我在控制台应用程序中使用它们。

这也意味着如果您的类库以 .NET Standard 2.0 为目标,则它们可以被两个平台使用,而无需更改目标。或许您可以将大部分代码移至 .NET Standard 2.0 库,只将配置留给特定于运行时的项目

虽然它确实提供了类似于 ASP.NET Core 代码的便捷 API,但您并不严格需要托管来使用所有其他扩展。您可以使用 Configure 等方法编写自己的 Startup 类并显式调用它们。最后,您需要访问 IServiceCollection,以便获取配置的服务并运行它们。

您可以使用Microsoft.Extensions.Hosting 包添加generic .NET host。除了通用 API 之外,它还增加了将长时间运行的服务托管到非 ASP.NET Core 项目的能力。

This blog post 展示了如何使用 Hosting 包创建一个控制台应用程序来启动一个长时间运行的服务,类似于 Windows 服务或守护进程,例如:

public static async Task Main(string[] args)

    var hostBuilder = new HostBuilder()
        .ConfigureServices((hostContext, services) =>
        
            services.AddSingleton<IBusControl>(serviceProvider =>
            
                return MassTransit.Bus.Factory.CreateUsingRabbitMq(cfg =>
                
                    var host = cfg.Host(new Uri("rabbitmq://localhost"), h =>
                    
                        h.Username("guest");
                        h.Password("guest");
                    );
                );
            );
            services.AddScoped<IHostedService, MassTransitHostedService>();
        );

    await hostBuilder.RunConsoleAsync();

.NET Generic Host 更详细,并显示了更多日志记录、DI、配置等示例。

更新

ASP.NET Core 与 .NET Core 绑定。您也可以在完整框架项目中使用它,只需在项目创建对话框中更改目标运行时

【讨论】:

【参考方案4】:

请从 nuget 包安装 Microsoft.AspNetCore.ResponseCaching。它可以解决您的问题。之后,描述的功能将在 .net 框架下可用。

【讨论】:

【参考方案5】:

尝试将“Microsoft.aspNetCore.App”添加到您的 *.csproj 文件中,这应该可以解决问题。

<ItemGroup>
    <FrameworkReference Include="Microsoft.aspNetCore.App" />
</ItemGroup>

【讨论】:

以上是关于从 .NET Core 2.1 降级到 .NET 4.7.1 时如何使用 IApplicationBuilder 和 IServiceCollection?的主要内容,如果未能解决你的问题,请参考以下文章

一次业务网关用ASP.NET Core 2.1重构的小结

从 .NET Core 2.1 迁移到 v3.1 后出现“被 CORS 阻止”错误

如何用 ASP.NET Core 实现熔断和降级?

ASP.NET Core 2.1 MVC - 无法设置从 Web api 响应接收到的 cookie

如何使用 fetch 将 FormData 从 javascript 发送到 ASP.NET Core 2.1 Web API

从 .net core 2.1 与 .net core 3.0 调用时的 StreamWriter 类行为