Obtenir le chemin du dossier wwwroot à partir du contrôleur ASP.NET 5 VS 2015

Désolé pour une question noob, mais il semble que je ne puisse pas obtenir Server.MapPath depuis Controller. J’ai besoin de sortir la liste de fichiers JSON du dossier images sur wwwroot. Ils sont est à wwwroot / images. Comment puis-je obtenir un chemin wwwroot fiable?

using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Mvc; using www.Classes; using System.Web; namespace www.Controllers { [Route("api/[controller]")] public class ProductsController : Controller { [HttpGet] public IEnumerable Get() { FolderScanner scanner = new FolderScanner(Server.MapPath("/")); return scanner.scan(); } } } 

Server.MapPath ne semble pas disponible à partir de l’espace de noms System.Web.

Le projet utilise ASP.NET 5 et dotNET 4.6 Framework

Vous devrez injecter IHostingEnvironment dans votre classe pour avoir access à la valeur de la propriété ApplicationBasePath : à propos de l’ dependency injection . Une fois la dépendance injectée, le chemin wwwroot doit être disponible. Par exemple:

 private readonly IHostingEnvironment _appEnvironment; public ProductsController(IHostingEnvironment appEnvironment) { _appEnvironment = appEnvironment; } 

Usage:

  [HttpGet] public IEnumerable Get() { FolderScanner scanner = new FolderScanner(_appEnvironment.ApplicationBasePath); return scanner.scan(); } 

Je sais que cela a déjà été répondu, mais cela m’a donné des résultats différents en fonction de mon environnement d’hébergement (IIS Express vs IIS). L’approche suivante semble bien fonctionner pour tous les environnements d’hébergement si vous voulez obtenir votre chemin wwwroot ( voir ce numéro de GitHub ).

Par exemple

 private readonly IHostingEnvironment _hostEnvironment; public ProductsController(IHostingEnvironment hostEnvironment) { _hostEnvironment = hostEnvironment; } [HttpGet] public IEnumerable Get() { FolderScanner scanner = new FolderScanner(_hostEnvironment.WebRootPath); return scanner.scan(); } 

Pour ceux qui se déploient sur Azure et entrent dans cette erreur. Ce que j’ai fait était un travail de contournement, je n’ai pas essayé de comprendre pourquoi l’environnement d’Azure est différent de celui des services IIS locaux. Voici mon travail autour de:

 if (ssortingng.IsNullOrWhiteSpace(_environment.WebRootPath)) { _environment.WebRootPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "wwwroot"); } 

Bien sûr, vous aurez besoin de:

 private IHostingEnvironment _environment; public OnboardingController(IHostingEnvironment environment) { _environment = environment; } 

Il existe un autre moyen de mettre en œuvre ce droit dès le démarrage. Ce n’est pas une solution exacte à ce cas en tant que tel, mais je l’ai modifié pour l’adapter à mes besoins. Nous avons besoin d’un singleton pour cela. C’est une classe de démarrage avec injection d’environnement.

 namespace www { public class Startup { private IHostingEnvironment _env; public Startup(IHostingEnvironment env) { _env = env; Environment.rootPath = env.WebRootPath; } public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseStaticFiles(); app.UseMvc(); } } } 

Les variables d’environnement que je cherchais sont là, IHOstingEnvironment. Mais pour ce faire, je dois créer une classe d’environnement comme celle-ci afin d’accéder facilement à tous les éléments d’environnement de tous les projets. Ce singleton fournira des données à la configuration, à l’environnement et à bien d’autres choses. Mais pour ce fil, je voudrais juste mettre une propriété rootPath .

 namespace www.Utilities { public class Environment { private static Environment instance; private static Ssortingng _rootPath; private Environment() { } public static Environment Instance { get { if (instance == null) { instance = new Environment(); } return instance; } } public static ssortingng rootPath { set { _rootPath = value; } get { return _rootPath; } } } } 

Comme j’ai accepté les réponses d’Oluwafemi, je vais continuer comme ça, puisqu’il m’a conduit à cela. Mais je pense que c’est le meilleur moyen d’accéder aux variables d’environnement tout au long du projet