首页 > 解决方案 > ASP.NET Core 3.0 get_HostingEnvironment() 在扩展中找不到方法

问题描述

下面的代码为我尝试在新的 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 包?

标签: c#asp.net-coreasp.net-core-webapiasp.net-core-3.0

解决方案


对于该netstandard2.0项目,我只能HostingEnvironmentHostBuilderContext(from 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;
}

HostingEnvironmentfrom (来自 IWebHostBuilder.ConfigureAppConfiguration)在由项目WebHostBuilderContext执行时仍会引发异常。netcoreapp3.0这适用于以前的版本。

此外,当注释掉时,我仍然可以在调试期间检查它: 在此处输入图像描述

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

更新

经过更多挖掘后,我发现了引用的区别:
-- netcoreapp3.0通过共享框架 Microsoft.AspNetCore.Hosting.Abstractions, Version=3.0.0.0
--netstandard2.0通过 NuGetMicrosoft.AspNetCore.Hosting.Abstractions, Version=2.2.0.0

v2.2 暴露在 v3.0Microsoft.AspNetCore.Hosting.IHostingEnvironment中已弃用

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


推荐阅读