Сопоставьте физический путь к файлу в asp.net mvc - PullRequest
41 голосов
/ 14 мая 2010

Я пытаюсь прочитать файл XSLT с диска в моем контроллере ASP.Net MVC. Я делаю следующее:

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

Однако, на полпути вниз по этой теме на forum.asp.net есть следующая цитата

HttpContext.Current это зло, и если вы использовать его в любом месте вашего приложения MVC вы делаете что-то не так, потому что вы не нужно.

Хотя я не использую Current, мне интересно, как лучше определить абсолютный физический путь к файлу в MVC? По какой-то причине (я не знаю почему!) HttpContext мне не подходит.

Есть ли лучший (или рекомендуемый / лучший метод) способ чтения файлов с диска в ASP.Net MVC?

Ответы [ 3 ]

75 голосов
/ 14 мая 2010
string filePath = Server.MapPath(Url.Content("~/Content/Xsl/"));

Я не согласен с идеей, что HttpContext.Current является "злом". Это не молоток для каждой проблемы, но он, безусловно, лучше, чем, например, Session для вещей, которые он может делать хорошо.

11 голосов
/ 06 мая 2015

Если вы используете WebApi или не используете его в классе контроллера, вы можете использовать в качестве альтернативы следующее:

HostingEnvironment.MapPath("/Content/Xsl/pubmed.xslt")
10 голосов
/ 15 мая 2010

Я бы вставил корневой путь сайта в конструктор контроллера структурой 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");
    }
}

Что касается корневого пути сайта, его можно выразить статическим свойством HostingEnvironment.ApplicationPhysicalPath .

...