ASP.NET MVC – найти абсолютный путь к папке App_Data из контроллера
-
13-09-2019 - |
Вопрос
Как правильно найти абсолютный путь к папке App_Data из контроллера в проекте ASP.NET MVC?Я хотел бы иметь возможность временно работать с файлом .xml и не хочу жестко запрограммировать путь.
Это не работает:
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
string path = VirtualPathUtility.ToAbsolute("~/App_Data/somedata.xml");
//.... do whatever
return View();
}
}
Я думаю, что вне веб-контекста VirtualPathUtility.ToAbsolute() не работает.строковый путь возвращается как «C:\App_Data\somedata.xml»
Где мне следует определить путь к файлу .xml в приложении MVC?global.asax и прикрепить к нему переменную уровня приложения?
Решение
ASP.NET MVC1 -> MVC3
string path = HttpContext.Current.Server.MapPath("~/App_Data/somedata.xml");
АСП.NET MVC4
string path = Server.MapPath("~/App_Data/somedata.xml");
Ссылка MSDN:
Другие советы
string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();
Вероятно, это более «правильный» способ получить это.
Я пытаюсь выработать привычку использовать HostingEnvironment
вместо Server
поскольку он работает и в контексте служб WCF.
HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");
Самый правильный способ – использовать HttpContext.Current.Server.MapPath("~/App_Data");
.Это означает, что вы можете получить путь только из метода, в котором HttpContext
доступен.Это имеет смысл:Каталог App_Data представляет собой структуру папок веб-проекта [1].
Если вам нужен путь к ~/App_Data из класса, к которому у вас нет доступа HttpContext
вы всегда можете внедрить интерфейс провайдера, используя свой IoC-контейнер:
public interface IAppDataPathProvider
{
string GetAppDataPath();
}
Реализуйте это, используя свой HttpApplication
:
public class AppDataPathProvider : IAppDataPathProvider
{
public string GetAppDataPath()
{
return MyHttpApplication.GetAppDataPath();
}
}
Где MyHttpApplication.GetAppDataPath
выглядит как:
public class MyHttpApplication : HttpApplication
{
// of course you can fetch&store the value at Application_Start
public static string GetAppDataPath()
{
return HttpContext.Current.Server.MapPath("~/App_Data");
}
}
[1] http://msdn.microsoft.com/en-us/library/ex526337%28v=vs.100%29.aspx
У Фила Хаака есть пример, который, на мой взгляд, немного более стабилен при работе с путями с сумасшедшими разделителями каталогов в стиле "\".Он также безопасно обрабатывает конкатенацию путей.Он поставляется бесплатно в System.IO.
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
Однако вы также можете попробовать «AppDomain.CurrentDomain.BaseDirector» вместо «Server.MapPath».
string filePath = HttpContext.Current.Server.MapPath("~/folderName/filename.extension");
ИЛИ
string filePath = HttpContext.Server.MapPath("~/folderName/filename.extension");
string Index = i;
string FileName = "Mutton" + Index + ".xml";
XmlDocument xmlDoc = new XmlDocument();
var path = Path.Combine(Server.MapPath("~/Content/FilesXML"), FileName);
xmlDoc.Load(path); // Can use xmlDoc.LoadXml(YourString);
это лучшее решение, чтобы получить путь, который именно нужен сейчас