2010-08-23 71 views
10

我有一些在ASP.NET MVC Web应用程序中运行时没有HttpContext的进程。该过程需要能够确定用于读取/写入数据的应用程序的目录目录的物理路径。但是,由于它没有HttpContext,所以我不会使用像Server.MapPath等花哨的东西。建议?如何确定没有HttpContext的文件的物理路径?

+1

即使'HttpContext.Current'可以为空,“Server.MapPath”仍然可以工作。如果你不“拥有”它,也许你的意思是你错过了对“System.Web”的引用? – Abel 2010-08-23 16:50:00

+0

@Abel:由于“Server”是HttpContext.Current(也是HttpApplication的一个属性)的属性,因此您不会“引用”“服务器”来在例如静态构造函数中使用.MapPath,既不其中的这些在静态环境下将可靠地提供。 “服务器”的类型是“HttpServerUtility”,其构造函数是内部的,所以你不能使用它,除非你可以从Global.asax中的HttpContext.Current或HttpApplication中获取它。因此,HttpRuntime.AppDomainAppPath是您应该使用的内容,正如您在下面的答案中发布的那样。 – Triynko 2013-08-01 00:54:57

回答

12

在网站上,最好是使用HttpRuntime.AppDomainAppPath,因为在执行路径的某些时刻(即,当网站启动时),没有HttpContext.Current可用。

另请参阅this post

+3

为什么HttpRuntime.AppDomainPath比AppDomain.BaseDirectory好?' – Matt 2010-08-23 16:46:44

+4

由于它的语义。当你进入HttpRuntime时,最好是向运行时询问正确的路径,而不是自己动手。此外,它使您的代码更具可读性,您的意图更清晰。最后,实现可能会改变,但即使在这种情况下,HttpRuntime仍然会返回正确的路径,并且AppDomain不会(同样可能适用于您已经启动分离的AppDomain的罕见情况)。 – Abel 2010-08-23 16:51:17

+0

谢谢。我编辑上面,因为它实际上是AppDomainAppPath而不是AppDomainPath(至少在.NET4上) – Matt 2010-08-23 17:48:20

4

最好的办法是使用AppDomain.BaseDirectory属性。只要你不摆弄自定义应用程序域,它就会指向你的根应用程序目录。换一种说法;这两个字符串是相同的:

string mapUsingAppDomain = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Contents"); 
string mapUsingServer = HttpContext.Current.Server.MapPath("~/Contents"); 
+0

谢谢你亲爱的先生 – Matt 2010-08-23 16:46:27

+2

在一个网站中,最好使用'HttpRuntime.AppDomainPath',它保证返回正确的路径。但driis是对的,我可以想到很少的情况下,这些方法可能会返回不同的东西。 – Abel 2010-08-23 16:47:56

相关问题