不使用httpcontext获取应用程序路径。 (asp.net)

时间:2010-03-09 14:06:39

标签: asp.net http iis httpcontext

怎么做?

我不想用这个:

HttpContext.Current.Server.MapPath

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

例如,如果一个线程开始做一些东西我不能使用httpcontext,但我仍然需要获取应用程序的路径。并且我不能将上下文作为参数传递或从共享var中读取它。

3 个答案:

答案 0 :(得分:72)

答案 1 :(得分:56)

有几种选择:

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");

答案 2 :(得分: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(如果在一台计算机上定义了多个域,则会失败)。