获取应用程序path而不使用httpcontext。 (asp.net)

怎么做?

我不想用这个:

HttpContext.Current.Server.MapPath 

有没有类似的function,我可以打电话,而不需要一个httpcontext?

例如,如果开始一个线程做一些东西,我不能使用httpcontext,但我仍然需要得到的应用程序的path。 不,我不能将上下文作为parameter passing或从共享variables中读取。

使用HttpRuntime.AppDomainAppPath属性。

有几个选项:

HttpRuntime.AppDomainAppPath

  WebApplication -> Web root folder UnitTest -> ArgumentNullException ConsoleApplication -> ArgumentNullException 

AppDomain.CurrentDomain.BaseDirectory

  WebApplication -> Web root folder UnitTest -> ...\AppDir\bin\Debug ConsoleApplication -> ...\AppDir\bin\Debug 

HostingEnvironment.ApplicationPhysicalPath

  WebApplication -> Web root folder UnitTest -> null ConsoleApplication -> null 

我build议使用AppDomain.CurrentDomain.BaseDirectory,因为它可以在任何types的项目中使用,并且可以进行设置。

例如,您可以将UnitTest BaseDirectory设置为通过命令指向您的Web根文件夹AppDomain.CurrentDomain.BaseDirectory:

 AppDomain.CurrentDomain.SetData("APPBASE", "path to your web root"); 

在寻找计算URL(永久链接在Web应用程序中)的方式来提供某些电子邮件通知时,我遇到了这个问题。

这些在另一个线程上生成,所以HttpContext不可用,我想避免在用于生成电子邮件的队列表中放入与URL相关的信息。

代码:

 public static String GetCurrentAppDomainBasePath(String prefix = "http://") { return String.Format("{0}{1}{2}", prefix, System.Net.Dns.GetHostEntry("").HostName, System.Web.HttpRuntime.AppDomainAppVirtualPath ); } 

该函数返回完整的虚拟path,如: http://full-host-name/AppName 。 当然,还有一些限制:硬编码协议( http ,https等)和使用hostname而不是domain name (如果在一台机器上定义了多个域,则会失败)。