10
votes

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.

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

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?

ÉDITER

La mise à jour du projet ClassLibrary1 vers netcoreapp3.0 et l'ajout de <FrameworkReference Include="Microsoft.AspNetCore.App" /> comme ci-dessous fonctionne:

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

J'aimerais toujours garder le projet comme netstandard2.0 si possible. Peut-être un package NuGet spécifique dont j'ai besoin pour cela?


1 commentaires

5 Réponses :


0
votes

Veuillez remplacer votre HostingEnvironment d' WebHostEnvironment 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.


1 commentaires

Il n'est disponible ni sur HostBuilderContext (depuis IHostBuilder.ConfigureAppConfiguration ) ni sur WebHostBuilderContext (depuis IWebHostBuilder.ConfigureAppConfiguration )



7
votes

Pour le projet netstandard2.0 , je n'ai pu obtenir le HostingEnvironment dans le HostBuilderContext (à partir de IHostBuilder.ConfigureAppConfiguration ) - avec le package Microsoft.Extensions.Hosting.Abstractions installé:

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 de WebHostBuilderContext (de IWebHostBuilder.ConfigureAppConfiguration) lève toujours une exception lorsqu'il est exécuté par un projet netcoreapp3.0 . Cela fonctionnait bien avec les versions précédentes.

Je peux également l'inspecter pendant le débogage lorsqu'il est commenté: entrez la description de l'image ici

Quelque chose semble encore un peu bizarre, mais au moins cela fonctionne maintenant.

MISE À JOUR

Après avoir creusé davantage, j'ai trouvé la différence dans les références:
- netcoreapp3.0 - via le framework partagé Microsoft.AspNetCore.Hosting.Abstractions, Version=3.0.0.0
- netstandard2.0 via NuGet Microsoft.AspNetCore.Hosting.Abstractions, Version=2.2.0.0

v2.2 expose Microsoft.AspNetCore.Hosting.IHostingEnvironment qui a été obsolète dans la v3.0

Depuis le 01/10/2019, la v3.0 n'est pas disponible sur NuGet.


2 commentaires

Comme vous l'avez constaté, Microsoft.AspNetCore.Hosting.Abstractions trouvent à des emplacements différents entre netcoreapp3.0 et netstandard2.0 . De netstandard2.0 à netcoreapp3.0 , il existe de nombreuses modifications de rupture, vous pouvez continuer à cibler vers netcoreapp3.0 avec la solution de contournement dans votre publication d'origine. Pour Microsoft.AspNetCore.Hosting.Abstractions avec la version 3.0, sa cible est netcoreapp3.0 ce qui signifie que vous ne pouvez pas l'utiliser dans netstandard2.0 .


100% @TaoZhou - la seule chose déroutante est toujours pourquoi je peux inspecter la valeur pendant le débogage. Des pensées à ce sujet?



0
votes

J'avais un problème similaire. Dans mon cas (EF 3.0), j'utilisais un projet avec Microsoft.Extensions.Hosting (3.0.1) . Cela utilisait une classe d'un projet différent. Ce deuxième projet incluait 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 commentaires

0
votes

Je suis tombé sur cela aussi; Comme vous l'avez noté, il semble que l'essentiel est simplement que cela ne fonctionnera pas car ASP.NET 3.x n'est pris en charge que sur les projets netcoreapp3.x .

Comme vous, une fois que j'ai converti ma bibliothèque netstandard2.0 en netcoreapp3.0 (ou .1 à ce stade vraiment) et extrait la référence du cadre Microsoft.AspNetCore.App (plutôt que d'extraire l'ensemble de Microsoft.Net.Sdk.Web ), il s'est arrangé.

Pas la meilleure réponse, mais c'est une décision «connue» / par conception de simplement laisser netstandard2.0 / netframework derrière.


0 commentaires

0
votes

J'ai eu ce problème, mon API sans serveur avait un autre projet comme référence. Sur ce projet référencé, j'utilisais le PackageReference suivant:

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

Je n'ai pu mettre cela en œuvre qu'après avoir changé la version en 2.1.0 J'utilisais les versions v3 +

Veuillez vérifier ce fil .


0 commentaires