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

时间:2013-12-19 15:57:41

标签: c# asp.net .net .net-4.0 .net-4.5

我在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中使用时会抛出以下异常。

  

请求在此上下文中不可用

3 个答案:

答案 0 :(得分:3)

答案很简单。首先,这与.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");

答案 1 :(得分:2)

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

尝试

HttpRuntime.AppDomainAppPath 

Server.MapPath(".")

代替。

答案 2 :(得分:1)

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

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