291

在 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 并将其粘贴为应用程序级变量?

4

8 回答 8

412

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

于 2009-08-12T21:12:37.517 回答
277
string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();

这可能是一种更“正确”的获取方式。

于 2010-11-22T09:13:56.887 回答
144

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

 HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");
于 2010-04-10T10:27:56.633 回答
9

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

如果您需要从无权访问的类到 ~/App_Data 的路径,HttpContext您始终可以使用 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

于 2012-10-23T11:05:16.893 回答
6

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”。

于 2010-11-16T20:49:49.143 回答
5
string filePath = HttpContext.Current.Server.MapPath("~/folderName/filename.extension");

或者

string filePath = HttpContext.Server.MapPath("~/folderName/filename.extension");
于 2016-07-13T08:02:44.670 回答
1
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);

这是获得现在真正需要的路径的最佳解决方案

于 2017-12-07T05:22:30.547 回答
1

这样我就得到了托管路径。

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

于 2021-07-21T12:22:22.037 回答