HttpContext在global.asax.cs中不起作用

我在global.asax.cs中有这个代码

protected void Application_Start(object sender, EventArgs e) { string logFile = HttpContext.Current.Request.PhysicalApplicationPath + "log4net.config"; } 

它在.NET 4.0中运行良好,但在.NET 4.5中使用时会引发以下exception。

在此上下文中不提供请求

错误似乎很清楚 – Request对象在该事件中不可用。

尝试

 HttpRuntime.AppDomainAppPath 

要么

 Server.MapPath(".") 

代替。

答案很简单。 首先,这与.NET版本无关 – 而是与IIS版本和ASP.NET模式有关。 错误消息几乎说明了一切 – 你不能再在该位置使用HttpContext(事实上,它还不存在)。

这主要与经典模式和集成模式之间发生的变化有关(其中ASP.NET不再是ISAPI DLL,而是在不同级别上集成到IIS中)。 如果我没记错的话,HttpContext现在只在请求本身的持续时间内存在,从BeginRequest开始,以EndRequest结束,或者某些东西。

如果适用,您可以将应用程序文件夹切换到IIS中的经典应用程序池,但我建议不要这样做,因为集成模式非常酷。 仅对您无法升级的旧应用程序使用Classic。

此外,您不应使用PhysicalApplicationPath。 这就是Server.MapPath的用途,或者是Application_start, HostingEnvironment.MapPath

所以你要用

 string logFile = HostingEnvironment.MapPath("~/log4net.config"); 

对于log4net,您还可以使用常规方法设置配置位置,例如:

[assembly:log4net.Config.XmlConfigurator(ConfigFile =“MyStandardLog4Net.config”,Watch = true)]