web-dev-qa-db-fra.com

Mappez le chemin d'accès du fichier physique dans asp.net mvc

J'essaie de lire un fichier XSLT à partir du disque dans mon contrôleur ASP.Net MVC. Ce que je fais est le suivant:

string filepath = HttpContext.Request.PhysicalApplicationPath;
filepath += "/Content/Xsl/pubmed.xslt";
string xsl = System.IO.File.ReadAllText(filepath);

Cependant, à mi-chemin de ce fil sur forums.asp.net il y a la citation suivante

HttpContext.Current est mauvais et si vous l'utilisez n'importe où dans votre application mvc, vous faites quelque chose de mal parce que vous n'en avez pas besoin.

Pendant que je n'utilise pas Current, je me demande quelle est la meilleure façon de déterminer le chemin physique absolu d'un fichier dans MVC? Pour une raison quelconque (je ne sais pas pourquoi!) HttpContext ne me convient pas.

Existe-t-il une meilleure méthode (ou recommandée/meilleure pratique) de lecture des fichiers à partir du disque dans ASP.Net MVC?

41
Phaedrus
string filePath = Server.MapPath(Url.Content("~/Content/Xsl/"));

Je ne suis pas d'accord avec l'idée que HttpContext.Current est "mauvais". Ce n'est pas le marteau pour tous les problèmes, mais c'est certainement mieux que, par exemple, Session pour des choses qu'il peut faire OK.

75
Craig Stuntz

Si vous utilisez Web Api ou pas spécifiquement dans une classe de contrôleur, vous pouvez utiliser ce qui suit comme alternative:

HostingEnvironment.MapPath("/Content/Xsl/pubmed.xslt")
12
raider33

J'aurais le chemin racine du site injecté dans le constructeur du contrôleur par le framework DI:

public class HomeController: Controller
{
    private readonly string _siteRoot;
    public HomeController(string siteRoot)
    {
        _siteRoot = siteRoot;
    }

    public ActionResult Index()
    {
        string filePath = Path.Combine(_siteRoot, @"Content\Xsl\pubmed.xslt");
        return File(filePath, "text/xml");
    }
}

En ce qui concerne le chemin racine du site, il peut être exprimé avec la propriété statique HostingEnvironment.ApplicationPhysicalPath .

10
Darin Dimitrov