IIS7引入了两种模式:经典模式和集成模式。经典模式与IIS的早期版本兼容,而集成模式则是增强版,支持许多新特性。本文将解释在将ASP.NET应用程序迁移到IIS7的集成模式时可能遇到的“Request is not available in this context”异常。
“Request is not available in this context”异常是在将ASP.NET应用程序迁移到IIS 7.0/7.5的集成模式时可能遇到的一个常见错误。这个异常发生在尝试在global.asax文件中的Application_Start方法实现中访问请求的HttpContext时。错误信息如下:
服务器错误 '/' 应用程序。 请求在此上下文中不可用 描述: 当前Web请求执行期间发生了一个未处理的异常。请查看堆栈跟踪以获取有关错误以及代码中错误起源的更多信息。 异常详细信息: System.Web.HttpException: 请求在此上下文中不可用 源错误: 当前Web请求执行期间生成了一个未处理的异常。可以使用下面的异常堆栈跟踪来识别异常的起源和位置。
在经典模式下,ASP.NET应用程序总是由第一个请求启动,因此可以通过静态HttpContext.Current字段获取请求上下文。但是,由于IIS7集成管道的设计变更,Application_Start事件中请求上下文不可用。
如果希望在Application_Start事件中访问请求上下文,可以选择将应用程序迁移到经典模式(不推荐),或者相应地更改应用程序。
如果选择更改应用程序,首先需要从Application_Start中移除对HttpContext.Current的引用。如果使用HttpContext.Current.Request获取应用程序路径,不需要使用请求,可以使用HttpRuntime.AppDomainAppVirtualPath代替。以下是代码示例:
Response.Write(HttpRuntime.AppDomainAppVirtualPath);
Response.Write(HttpContext.Current.Request.ApplicationPath);
// 两者将返回相同的结果。
void Application_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
// 在这里初始化第一次请求...
}
// 获取上下文,然后执行初始化步骤。