ASP.NET 核心 3.0 get_HostingEnvironment() 在扩展中找不到方法

ASP.NET Core 3.0 get_HostingEnvironment() Method not found in extension

下面的代码复制了我试图在新的 ASP.NET Core 3.0 API 项目中创建的某些扩展的错误。

using ClassLibrary1;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace WebApplication1
{
  public class Program
  {
    public static void Main(string[] args)
    {
      CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
              webBuilder.UseStartup<Startup>();

              webBuilder.ConfigureAppConfiguration((context, config) =>
              {
                // this works fine
                var env = context.HostingEnvironment;
              });

              webBuilder.CustomConfigureAppConfiguration();
            })
            .ConfigureAppConfiguration((context, config) =>
            {
              // this works fine
              var env = context.HostingEnvironment;
            })
            .CustomConfigureAppConfiguration();
  }
}

Extensions class 需要在不同的项目中。在同一个主项目中似乎工作正常。

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

// This project can be either netstandard2.0 or netcoreapp3.0
namespace ClassLibrary1
{
  public static class Extensions
  {
    public static IWebHostBuilder CustomConfigureAppConfiguration(this IWebHostBuilder hostBuilder)
    {
      hostBuilder.ConfigureAppConfiguration((context, config) =>
      {
        // this fails with System.MissingMethodException: 'Method not found: 'Microsoft.AspNetCore.Hosting.IHostingEnvironment Microsoft.AspNetCore.Hosting.WebHostBuilderContext.get_HostingEnvironment()'.'
        var env = context.HostingEnvironment;
      });

      return hostBuilder;
    }

    public static IHostBuilder CustomConfigureAppConfiguration(this IHostBuilder hostBuilder)
    {
      hostBuilder.ConfigureAppConfiguration((context, config) =>
      {
        // this fails with System.MissingMethodException: 'Method not found: 'Microsoft.Extensions.Hosting.IHostingEnvironment Microsoft.Extensions.Hosting.HostBuilderContext.get_HostingEnvironment()'.'
        var env = context.HostingEnvironment;
      });

      return hostBuilder;
    }
  }
}

它仅在运行时失败,并且仅在访问 HostingEnvironment 时失败。当 removing/commenting 分配 var env = context.HostingEnvironment; 时,我仍然可以在调试中检查并查看它。

知道我在这里遗漏了什么吗?

编辑

ClassLibrary1 项目更新为 netcoreapp3.0 并添加 <FrameworkReference Include="Microsoft.AspNetCore.App" /> 如下:

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

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

  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.2.0" />
  </ItemGroup>

</Project>

如果可能,我仍然希望将项目保留为 netstandard2.0。也许我需要一些特定的 NuGet 包?

请将您的 HostingEnvironment 替换为 WebHostEnvironment

正如文档所说:

https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio#migrate-startupconfigure

Replace IHostingEnvironment with IWebHostEnvironment and add a using statement for the Microsoft.Extensions.Hosting namespace.

对于 netstandard2.0 项目,我只能在 HostBuilderContext 中获取 HostingEnvironment(来自 IHostBuilder.ConfigureAppConfiguration)- 安装了 Microsoft.Extensions.Hosting.Abstractions 包:

public static IHostBuilder CustomConfigureAppConfiguration(this IHostBuilder hostBuilder)
{
  hostBuilder.ConfigureAppConfiguration((context, config) =>
  {
    // this works with Microsoft.Extensions.Hosting.Abstractions installed
    var env = context.HostingEnvironment;
  });

  return hostBuilder;
}

HostingEnvironment from WebHostBuilderContext(from IWebHostBuilder.ConfigureAppConfiguration)在被 netcoreapp3.0 项目执行时仍然抛出异常。这适用于以前的版本。

此外,当注释掉时,我仍然可以在调试期间检查它:

似乎还有点不对劲,但至少现在可以了。

更新

经过更多挖掘,我发现了参考文献的不同之处:
- netcoreapp3.0 - 通过 共享框架 Microsoft.AspNetCore.Hosting.Abstractions, Version=3.0.0.0
- netstandard2.0 通过 NuGet Microsoft.AspNetCore.Hosting.Abstractions, Version=2.2.0.0

v2.2 公开了 Microsoft.AspNetCore.Hosting.IHostingEnvironment,它在 v3.0

中是 deprecated

自 2019 年 10 月 1 日起,v3.0 在 NuGet 上不可用。

我遇到了类似的问题。在我的例子 (EF 3.0) 中,我使用了一个带有 Microsoft.Extensions.Hosting (3.0.1) 的项目。这是使用来自不同项目的 class。第二个项目包括 Microsoft.Azure.WebJobs.Extensions (3.0.5)。这个包有 Microsoft.Azure.WebJobs (3.0.14) 作为依赖项。这包括 Microsoft.Extensions.Hosting (2.1.0),它与 EF 3.0 不兼容。包括

    <PackageReference Include="Microsoft.Extensions.Hosting" Version="3.0.1" />

在第二个项目中解决了我的问题。

我也遇到过这个;正如您所指出的,似乎最重要的是它不会起作用,因为 ASP.NET 3.x 仅在 netcoreapp3.x 项目上受支持。

像你一样,一旦我将我的 netstandard2.0 库转换为 netcoreapp3.0(或者实际上是 .1)并引入 Microsoft.AspNetCore.App 框架参考(而不是引入整个Microsoft.Net.Sdk.Web) 它自行解决了。

这不是最好的答案,但它是 "known"/设计决定,只是将 netstandard2.0/netframework 留在后面。

我有这个问题,我的无服务器API有另一个项目作为参考。在那个引用的项目中,我使用了以下 PackageReference:

  • Microsoft.Extensions.Configuration.Abstractions
  • Microsoft.Extensions.Logging.Abstractions

只有将版本更改为 2.1.0 后,我才能使它正常工作 我使用的是 v3+

版本

请检查这个thread