ASP.NET MVC - найти абсолютный путь к папке App_Data из контроллера

Каков правильный способ найти абсолютный путь к папке 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 и привязать его к переменной уровня приложения?

Ответ 1

ASP.NET MVC1 → MVC3

string path = HttpContext.Current.Server.MapPath("~/App_Data/somedata.xml");

ASP.NET MVC4

string path = Server.MapPath("~/App_Data/somedata.xml");


Ссылка MSDN:

Метод HttpServerUtility.MapPath

Ответ 2

string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();

Это самый "правильный" способ получить его.

Ответ 3

Я пытаюсь привыкнуть использовать HostingEnvironment вместо Server, поскольку он работает и в контексте служб WCF.

 HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");

Ответ 4

У Фила Хаака есть пример, который, по моему мнению, несколько более стабилен, когда касается путей с сумасшедшими разделителями каталога стиля "\". Он также безопасно обрабатывает конкатенацию путей. Он поставляется бесплатно в System.IO

var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);

Однако вы также можете попробовать "AppDomain.CurrentDomain.BaseDirector" вместо "Server.MapPath".

Ответ 5

Самый правильный способ - использовать 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

Ответ 6

string filePath = HttpContext.Current.Server.MapPath("~/folderName/filename.extension");

ИЛИ

string filePath = HttpContext.Server.MapPath("~/folderName/filename.extension");

Ответ 7

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);

это лучшее решение для того, чтобы получить путь, который сейчас нужен именно сейчас