1

我正在尝试压缩我网站的网页以提高其速度。我完成了 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;
}

它不会在视觉工作室中给出错误。但是当我将此代码放在 IIS 上时,它会给出错误/异常

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

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

4

2 回答 2

0

Application_Start当您的 Web 应用程序启动并且此启动与任何页面请求无关时执行,因为此时尚未发生页面请求。Request上不可用Application_Start

你可以Server.MapPath()改用。

于 2012-07-06T05:35:55.003 回答
0

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

但是,当您将它放到 IIS 7 框中时,它的Managed pipeline mode = Integrated会失败。这是因为集成管道意味着站点在应用程序池启动后立即启动,这意味着没有请求对象可以挂接。

为了解决这个问题,我建议让 IIS 压缩内容而不是手动完成,这个链接有帮助你入门的详细信息,这里有一个关于它可以产生的差异的很好的概述。

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

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

于 2012-07-06T05:42:49.800 回答