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

StackOverflow https://stackoverflow.com/questions/1268738

  •  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:

Метод HttpServerUtility.MapPath

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top