web-dev-qa-db-fra.com

ASP.NET Core 3.0 get HostingEnvironment (), méthode introuvable dans l'extension

Ci-dessous le code pour répliquer l'erreur pour certaines extensions que j'essaie de créer dans un nouveau projet d'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();
  }
}

Cette classe Extensions doit être dans un projet différent. Semble bien fonctionner dans le même projet principal.

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;
    }
  }
}

Il échoue uniquement lors de l'exécution, et uniquement lors de l'accès à HostingEnvironment. Lorsque vous supprimez/commentez le var env = context.HostingEnvironment; affectation, je peux toujours l'inspecter et l'afficher correctement dans le débogage.

Une idée de ce qui me manque ici?

MODIFIER

Mise à jour du ClassLibrary1 projeter vers netcoreapp3.0 et en ajoutant <FrameworkReference Include="Microsoft.AspNetCore.App" /> comme ci-dessous fonctionne:

<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>

Je voudrais quand même garder le projet comme netstandard2.0 si possible. Peut-être que j'ai besoin d'un package NuGet spécifique pour cela?

4
JvR

Veuillez remplacer votre HostingEnvironment par WebHostEnvironment.

Comme le dit le document:

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

Remplacez IHostingEnvironment par IWebHostEnvironment et ajoutez une instruction using pour l'espace de noms Microsoft.Extensions.Hosting.

0
Anduin

J'avais un problème similaire. Dans mon cas (EF 3.0), j'utilisais un projet avec Microsoft.Extensions.Hosting (3.0.1). C'était en utilisant une classe d'un autre projet. Ce deuxième projet comprenait Microsoft.Azure.WebJobs.Extensions (3.0.5). Ce package a Microsoft.Azure.WebJobs (3.0.14) comme dépendance. Cela inclut Microsoft.Extensions.Hosting (2.1.0), qui était incompatible avec EF 3.0. Comprenant

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

dans le deuxième projet a résolu mon problème.

0
xavier