ASP。从控制器中找到App_Data文件夹的绝对路径

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

这行不通:

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


//.... do whatever


return View();
}


}
我认为在web上下文之外VirtualPathUtility.ToAbsolute()不起作用。 返回"C:\App_Data\somedata.xml"

我应该在哪里确定MVC应用程序中的.xml文件的路径? 全球。Asax,并坚持它的应用程序级变量?< / p >
283387 次浏览

ASP。Net mvc1 -> mvc3

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

ASP。净MVC4

string path = Server.MapPath("~/App_Data/somedata.xml");
人力资源> < p > < MSDN参考:< / p >

HttpServerUtility。MapPath方法< / >

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

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

Phil Haak有一个例子,我认为在处理带有疯狂的“\”风格的目录分隔符的路径时,它更稳定一些。它还可以安全地处理路径连接。它在系统中是免费的。IO

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

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

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

这可能是一种更“正确”的理解方式。

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

如果你需要从一个你无法访问HttpContext的类中获取~/App_Data的路径,你可以使用你的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");
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);

这是获得目前所需路径的最佳解决方案

这样我就得到了主机路径。

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;


namespace IHostingEnvironmentExample.Controllers
{
public class HomeController : Controller
{
private IHostingEnvironment _env;
public HomeController(IHostingEnvironment env)
{
_env = env;
}
public IActionResult Index()
{
var webRoot = _env.WebRootPath;
var file = System.IO.Path.Combine(webRoot, "test.txt");
System.IO.File.WriteAllText(file, "Hello World!");
return View();
}
}
}

https://forums.asp.net/t/1696005.aspx?How+to+get+Local+Server+path+in+mvc