如何在不使用HttpContext.Current的情况下获取ASP.NET Web应用程序的物理位置?

我发现自己需要根据相对于正在运行的ASP.NET Web应用程序的物理位置的文件来配置log4net。 我们希望尽早启动记录器,因此Application_Start似乎是一个合适的位置。 在IIS6中,这工作正常并且已经运行了很长时间,但现在我们转移到IIS7,这将不再起作用:

 string absolutePath = HttpContext.Current.Request.PhysicalApplicationPath; 

因为HttpContext.Current在许多global.asax (应用程序,会话)事件中不可用。 这是旧闻,我们都知道它引发了现在臭名昭着的请求在此上下文错误中不可用 。 我们不想回到经典模式。

现在,问题很简单:不使用HttpContext ,是否可以找到当前运行的Web应用程序实例的物理位置?

尝试HttpRuntime.AppDomainAppPath 。 有关详细信息,请阅读IIS7集成模式: Mike Volodarsky发布的Application_Start中的此上下文exception中的请求不可用 。

作为我自己的问题的替代答案,我想补充说Server.MapPath()也在Application_Start事件期间工作。 然后,应用程序域路径将等于Server.MapPath("~") ,但它对于映射相对路径更加方便,从而消除了连接的负担(MapPath的开头意味着什么)。