Метод get_HostingEnvironment () ASP.NET Core 3.0 не найден в расширении

Ниже приведен код для репликации ошибки для некоторых расширений, которые я пытаюсь создать в новом проекте API ASP.NET Core 3.0.

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?


person JvR    schedule 30.09.2019    source источник
comment
проверьте это docs.microsoft.com/en-us/aspnet/core/migration/   -  person Kahbazi    schedule 30.09.2019


Ответы (5)


Для проекта netstandard2.0 я смог получить только HostingEnvironment в HostBuilderContext (от 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 из WebHostBuilderContext (из 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.

По состоянию на 01.10.2019 версия 3.0 недоступна в NuGet.

person JvR    schedule 30.09.2019
comment
Как вы обнаружили, Microsoft.AspNetCore.Hosting.Abstractions находятся в разных местах между netcoreapp3.0 и netstandard2.0. С netstandard2.0 по netcoreapp3.0 есть много изменений, вы можете продолжать ориентироваться на netcoreapp3.0 с обходным путем в своем исходном сообщении. Для Microsoft.AspNetCore.Hosting.Abstractions с версией 3.0 его целью является netcoreapp3.0, что означает, что вы не можете использовать его в netstandard2.0. - person Edward; 01.10.2019
comment
100% @TaoZhou - единственное, что сбивает с толку, это почему я могу проверить значение во время отладки. Есть мысли по этому поводу? - person JvR; 01.10.2019
comment
У меня работал с .NET Core 3.1 / .NET Standard 2.1. Добавлен <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="5.0.0" /> в общую библиотеку. - person Jaded; 30.04.2021

Пожалуйста, замените ваш HostingEnvironment на WebHostEnvironment.

Как говорится в документе:

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

Замените IHostingEnvironment на IWebHostEnvironment и добавьте оператор using для пространства имен Microsoft.Extensions.Hosting.

person Anduin    schedule 30.09.2019
comment
Он недоступен ни на HostBuilderContextIHostBuilder.ConfigureAppConfiguration), ни на WebHostBuilderContextIWebHostBuilder.ConfigureAppConfiguration) - person JvR; 30.09.2019

У меня была похожая проблема. В моем случае (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" />

во втором проекте решил мою проблему.

person xavier    schedule 27.11.2019

Я тоже сталкивался с этим; Как вы заметили, похоже, что суть в том, что он просто не будет работать, поскольку ASP.NET 3.x поддерживается только в netcoreapp3.x проектах.

Как и вы, как только я преобразовал свою netstandard2.0 библиотеку в netcoreapp3.0 (или .1 на данный момент на самом деле) и вытащил ссылку на Microsoft.AspNetCore.App фреймворка (вместо того, чтобы вытащить весь Microsoft.Net.Sdk.Web), он разобрался сам.

Не лучший ответ, но это «известное» / изначальное решение просто оставить netstandard2.0 / netframework позади.

person Ran Sagy    schedule 04.06.2020

У меня была эта проблема, у моего бессерверного API был другой проект в качестве ссылки. В этом упоминаемом проекте я использовал следующий PackageReference:

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

Я смог заставить это работать только после изменения версии на 2.1.0. Я использовал версии v3 +.

Пожалуйста, проверьте эту ветку.

person Jorge Freitas    schedule 15.11.2020