Подтвердить что ты не робот

Сопоставьте физический путь к файлу в asp.net mvc

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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