在global.asax中获取aspx页面压缩的异常

时间:2012-07-06 05:19:37

标签: c# asp.net compression gzip

我正在尝试压缩我网站的网页以提高其速度。 我完成了JS和CSS压缩。 现在我想在响应出来之前压缩我的aspx页面。  我在我的网站的global.asax文件中使用此代码

void Application_Start(object sender, EventArgs e)
{
    HttpContext incoming = HttpContext.Current;
    string oldpath = incoming.Request.Path.ToLower();
    incoming.Response.Filter = new System.IO.Compression.GZipStream(incoming.Response.Filter, System.IO.Compression.CompressionMode.Compress);
    HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip");
    HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;
}
它不会在visual studio中出错。但是当我把这个代码放在IIS上时,它会给出错误/异常

Exception Details: System.Web.HttpException: Request is not available in this context

任何人都可以建议或解释我应该做什么。

2 个答案:

答案 0 :(得分:0)

当您的Web应用程序启动并且此启动与任何页面请求无关时,

Application_Start将被执行,因为此时页面请求尚未发生。 Request无法使用Application_Start

您可以改为使用Server.MapPath()

答案 1 :(得分:0)

这里的问题是难以捉摸的,内置的Visual Studio cassini Web服务器将使用在第一次请求时启动应用程序的旧模式运行请求,这与托管管道模式=经典相同在IIS中。这意味着您有一个请求对象供您立即访问,因为请求是触发app_start的内容。

但是,当您将其置于带有托管管道模式=集成的IIS 7框中时,它将失败。这是因为集成管道意味着一旦应用程序池启动就会启动该站点,这意味着没有请求对象可以挂钩。

要解决此问题,我建议让IIS压缩内容而不是手动执行,this链接有详细信息可以帮助您入门,here是一个关于差异的好大纲可以制作。

如果您真的决定在应用程序中进行压缩,我建议将其实现为HttpModule,类似于this示例。

编辑:gzipping HttpModule here的另一个实现。