我在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中使用时会抛出以下异常。
请求在此上下文中不可用
答案 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)]