ASP.NET MVC – 从Controller中查找App_Data文件夹的绝对path

在ASP.NET MVC项目中,从控制器中findApp_Data文件夹的绝对path的正确方法是什么? 我希望能够临时使用.xml文件,而且我不想硬编码path。

这不起作用:

[HandleError] public class HomeController : Controller { public ActionResult Index() { string path = VirtualPathUtility.ToAbsolute("~/App_Data/somedata.xml"); //.... do whatever return View(); } } 

我认为在Web上下文VirtualPathUtility.ToAbsolute()不起作用。 stringpath返回为“C:\ App_Data \ somedata.xml”

我应该在哪里确定MVC应用程序中的.xml文件的path? global.asax并坚持它一个应用程序级别的variables?

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方法

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

这是获得它的最“正确”的方式。

我试图养成使用HostingEnvironment而不是Server的习惯,因为它也在WCF服务的上下文中工作。

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

菲尔Haak有一个例子,我认为是处理与疯狂的“\”风格目录分隔符path时更稳定。 它也安全地处理path连接。 它在System.IO中免费

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

但是,您也可以尝试“AppDomain.CurrentDomain.BaseDirector”而不是“Server.MapPath”。

最正确的方法是使用HttpContext.Current.Server.MapPath("~/App_Data"); 。 这意味着您只能从HttpContext可用的方法中检索path。 这是有道理的:App_Data目录是一个Web项目文件夹结构[1]。

如果您需要从无法访问HttpContext的类中获取〜/ App_Data的path,则可以始终使用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

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

要么

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