ASP.NET Core 3.0中的get_HostingEnvironment()方法在扩展中未被找到

13

以下代码用于复制我尝试在新的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类需要位于不同的项目中。当在同一主项目中时似乎可以正常工作。

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时才会出现故障。当删除/注释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包吗?


5个回答

12
对于netstandard2.0项目,我只能在HostBuilderContext中(从IHostBuilder.ConfigureAppConfiguration)获取HostingEnvironment - 需要安装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;
}
WebHostBuilderContext(来自IWebHostBuilder.ConfigureAppConfiguration)中的HostingEnvironmentnetcoreapp3.0项目中执行时仍会抛出异常。这在以前的版本中运行良好。

当被注释掉时,我仍然可以在调试期间检查它: enter image description here

似乎还有一些问题,但至少现在这个可以工作了。

更新

经过更深入的挖掘,我发现引用之间的差异:
- netcoreapp3.0 - 通过shared framework Microsoft.AspNetCore.Hosting.Abstractions, Version=3.0.0.0
- 通过NuGet的netstandard2.0 Microsoft.AspNetCore.Hosting.Abstractions, Version=2.2.0.0

v2.2公开了Microsoft.AspNetCore.Hosting.IHostingEnvironment,该版本已在v3.0中弃用

截至2019/10/01,v3.0在NuGet上不可用。


1
正如您所发现的那样,Microsoft.AspNetCore.Hosting.Abstractionsnetcoreapp3.0netstandard2.0 之间的位置不同。从 netstandard2.0netcoreapp3.0,有许多重大变化,您可以使用原始帖子中的解决方法继续针对 netcoreapp3.0 进行目标设置。对于版本为 3.0 的 Microsoft.AspNetCore.Hosting.Abstractions,其目标是 netcoreapp3.0,这意味着您无法在 netstandard2.0 中使用它。 - Edward
1
@TaoZhou - 唯一令人困惑的是为什么我可以在调试期间检查该值。您对此有何想法? - JvR
在我的.NET Core 3.1/.NET Standard 2.1中运行良好。将<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="5.0.0" />添加到共享库中。 - Jaded

0

1
它既不在HostBuilderContext(来自IHostBuilder.ConfigureAppConfiguration)中,也不在WebHostBuilderContext(来自IWebHostBuilder.ConfigureAppConfiguration)中可用。 - JvR

0
我遇到了这个问题,我的无服务器API引用了另一个项目。在那个被引用的项目中,我使用了以下PackageReference:
  • Microsoft.Extensions.Configuration.Abstractions
  • Microsoft.Extensions.Logging.Abstractions

只有将版本更改为2.1.0后,我才能够使其工作。 我之前使用的是v3+版本。

请查看thread


0

我也遇到了这个问题;正如你所指出的那样,底线似乎很简单:由于ASP.NET 3.x仅支持netcoreapp3.x项目,因此它将无法工作。

和你一样,当我将我的netstandard2.0库转换为netcoreapp3.0(或者在这个时候是netcoreapp3.1),并拉取Microsoft.AspNetCore.App框架引用(而不是拉取整个Microsoft.Net.Sdk.Web),它就自己解决了。

虽然不是最好的答案,但这是一个“已知”/设计决策,旨在让netstandard2.0/netframework保持不变。


0

我曾经遇到过类似的问题。在我的情况下(EF 3.0),我正在使用一个项目,其中包含 Microsoft.Extensions.Hosting (3.0.1)。这个项目使用了来自另一个项目的一个类。第二个项目包括 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" />

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


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