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