Сопоставьте физический путь к файлу в 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?
Ответы
Ответ 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")