不使用HttpContext获取应用程序路径(ASP.NET)

52

如何做到?

我不想使用这个方法:

HttpContext.Current.Server.MapPath

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

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

3个回答

75

2
这是一个大多数人不需要使用的低级类。 - SLaks

62

有几个选项:

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

1
我在寻找计算URL(Web应用程序中的永久链接)以提供某些电子邮件通知时遇到了这个问题。这些URL是在另一个线程上生成的,因此没有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(如果在单台计算机上定义了多个域,则会失败)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接