ASP.NET MVC - 从Controller中查找App_Data文件夹的绝对路径

Bud*_*Joe 277 .net asp.net-mvc absolute-path

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

这不起作用:

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

        //.... do whatever 

        return View();
    }

}
Run Code Online (Sandbox Code Playgroud)

我认为在Web上下文之外VirtualPathUtility.ToAbsolute()不起作用.字符串路径返回"C:\ App_Data\somedata.xml"

我应该在哪里确定MVC应用程序中.xml文件的路径?global.asax并坚持使用应用程序级变量?

eu-*_*-ne 391

ASP.NET MVC1 - > MVC3

string path = HttpContext.Current.Server.MapPath("~/App_Data/somedata.xml");
Run Code Online (Sandbox Code Playgroud)

ASP.NET MVC4

string path = Server.MapPath("~/App_Data/somedata.xml");
Run Code Online (Sandbox Code Playgroud)


MSDN参考:

HttpServerUtility.MapPath方法

  • 使用`System.Web.Hosting.HostingEnvironment.MapPath()` (25认同)
  • 对于mvc4,它只是Server.MapPath() (8认同)
  • @Cleiton除了Url.Content提供URL,而不是服务器路径. (6认同)
  • MVC4方式不起作用,我要么必须使用`Current`或`Server.MapPath(...)`作为SeriousM提到. (6认同)
  • 另一个好方法是使用Url.Content(string)方法. (4认同)

Ale*_*lex 270

string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();
Run Code Online (Sandbox Code Playgroud)

这是获得它的最"正确"方式.

  • 因为它不是硬编码"App_Data"字符串.这可以在未来的版本中改变,或者在Mono等中有所不同等. (25认同)
  • 关于这个答案的好处是我可以在我的Model项目_without_引用system.web中使用它,从而有助于保持清晰的分离.好一个! (19认同)
  • 未在[MSDN](http://msdn.microsoft.com/en-us/library/system.appdomain.getdata.aspx)中记录,因此不应使用. (13认同)
  • Pete的博客文章也谈到为什么使用它可能不是一个好主意. (10认同)
  • 硬编码另一个字符串而不是"App_Data"不是一种"正确"的方式.此外,.NET Core中没有更多应用程序域. (10认同)
  • 这篇博文解释了这个解决方案http://vaultofthoughts.net/GettingTheLocationOfAppDataFolder.aspx (6认同)
  • 关于硬编码'App_Data'(我承认我讨厌其中一些强调)的好处是,将来看这个代码的任何人都能够立即看到你正在做什么 - 而"DataDirectory"很可能会混淆人 (2认同)

Sim*_*ver 134

我试图养成使用的习惯,HostingEnvironment而不是Server在WCF服务的上下文中使用它.

 HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");
Run Code Online (Sandbox Code Playgroud)

  • Server.MapPath()最终调用HostingEnvironment.MapPath(),请参阅http://stackoverflow.com/questions/944219/what-is-the-difference-between-server-mappath-and-hostingen-mappath (6认同)
  • 这是我的最爱,因为我可以在控制器之外使用它。如果有人需要知道相关的“使用”,则在“ System.Web.Hosting”命名空间中。参考:https://docs.microsoft.com/zh-cn/dotnet/api/system.web.hosting.hostingenvironment (3认同)

Dan*_*röm 7

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

如果您需要从无法访问的类中获取〜/ App_Data的路径,则HttpContext可以始终使用IoC容器注入提供程序接口:

public interface IAppDataPathProvider
{
    string GetAppDataPath();
}
Run Code Online (Sandbox Code Playgroud)

使用您的实现它HttpApplication:

public class AppDataPathProvider : IAppDataPathProvider
{
    public string GetAppDataPath()
    {
        return MyHttpApplication.GetAppDataPath();
    }
}
Run Code Online (Sandbox Code Playgroud)

其中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");
    }
}
Run Code Online (Sandbox Code Playgroud)

[1] http://msdn.microsoft.com/en-us/library/ex526337%28v=vs.100%29.aspx


Rud*_*tae 6

Phil Haak有一个例子,我认为在使用疯狂的"\"样式目录分隔符处理路径时会更稳定一些.它还安全地处理路径连接.它在System.IO中免费提供

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

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


Dip*_*iya 5

string filePath = HttpContext.Current.Server.MapPath("~/folderName/filename.extension");
Run Code Online (Sandbox Code Playgroud)

或者

string filePath = HttpContext.Server.MapPath("~/folderName/filename.extension");
Run Code Online (Sandbox Code Playgroud)