在 ASP.NET MVC 项目中从控制器中找到 App_Data 文件夹的绝对路径的正确方法是什么?我希望能够临时使用 .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”
我应该在哪里确定 MVC 应用程序中 .xml 文件的路径? global.asax 并将其粘贴为应用程序级变量?
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");
HttpServerUtility.MapPath Method
string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();
这可能是一种更“正确”的获取方式。
我尝试养成使用 HostingEnvironment
而不是 Server
的习惯,因为它也在 WCF 服务的上下文中工作。
HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");
System.Web.Hosting
命名空间中,以防任何人需要知道相关的 using
。参考:docs.microsoft.com/en-us/dotnet/api/…
最正确的方法是使用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
HttpContext.Current
,怎么可能在一个地方不可用?静态属性在哪里不可用?
Phil Haak 有一个示例,我认为在处理带有疯狂“\”样式目录分隔符的路径时会更稳定一些。它还可以安全地处理路径连接。它在 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");
这样我就得到了托管路径。
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
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);
这是获得现在真正需要的路径的最佳解决方案
Current
或Server.MapPath(...)
。System.Web.Hosting.HostingEnvironment.MapPath()