ASP.NET MVC - Encontre caminho absoluto para a pasta App_Data do Controlador
-
13-09-2019 - |
Pergunta
O que é a maneira correta de encontrar o caminho absoluto para a pasta App_Data de um controlador em um projeto ASP.NET MVC? Eu gostaria de ser capaz de funcionar temporariamente com um arquivo .xml e eu não quero codificar o caminho.
Isso não funciona:
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
string path = VirtualPathUtility.ToAbsolute("~/App_Data/somedata.xml");
//.... do whatever
return View();
}
}
Eu acho que fora do contexto web VirtualPathUtility.ToAbsolute () não funciona. string path volta como "C: \ App_Data \ somedata.xml"
Onde devo determinar o caminho do arquivo .xml em um aplicativo MVC? Global.asax e colá-la uma variável de nível de aplicativo?
Solução
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 Referência:
Outras dicas
string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();
Esta é provavelmente uma maneira mais "correta" de consegui-lo.
Eu tento adquirir o hábito de usar HostingEnvironment
vez de Server
como ele funciona dentro do contexto de serviços WCF também.
HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");
A maneira mais correta é usar HttpContext.Current.Server.MapPath("~/App_Data");
. Isto significa que você só pode recuperar o caminho de um método onde o HttpContext
está disponível. Faz sentido:. O diretório App_Data é uma estrutura de pastas do projeto web [1]
Se precisar o caminho para ~ / App_Data de uma classe onde você não tem acesso ao HttpContext
você sempre pode injetar uma interface de provedor usando o contêiner IoC:
public interface IAppDataPathProvider
{
string GetAppDataPath();
}
implementá-lo usando o seu HttpApplication
:
public class AppDataPathProvider : IAppDataPathProvider
{
public string GetAppDataPath()
{
return MyHttpApplication.GetAppDataPath();
}
}
Onde olhares MyHttpApplication.GetAppDataPath
como:
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
Phil Haak tem um exemplo que eu acho que é um pouco mais estável quando se lida com caminhos com loucos "\" separadores de diretório de estilo. Ele também lida com segurança caminho concatenação. Ele vem de graça em System.IO
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
No entanto, você pode também tentar "AppDomain.CurrentDomain.BaseDirector" em vez de "Server.MapPath".
string filePath = HttpContext.Current.Server.MapPath("~/folderName/filename.extension");
ou
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);
Esta é a melhor solução para obter o caminho que é exatamente precisa, por agora