52

怎么做?

我不想用这个:

HttpContext.Current.Server.MapPath

是否有类似的函数可以在不需要 httpcontext 的情况下调用?

例如,如果启动一个线程做一些事情,我不能使用 httpcontext,但我仍然需要获取应用程序的路径。不,我不能将上下文作为参数传递或从共享变量中读取它。

4

3 回答 3

75

使用该HttpRuntime.AppDomainAppPath物业。

于 2010-03-09T14:08:15.333 回答
60

有几种选择:

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

我建议使用 AppDomain.CurrentDomain.BaseDirectory,因为它可以用于任何类型的项目并且可以设置。

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

AppDomain.CurrentDomain.SetData("APPBASE", "path to your web root");
于 2014-03-01T22:15:07.463 回答
1

在寻找计算 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
   );
}

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

于 2016-03-18T12:24:13.010 回答