【问题标题】:getting exception for compression of aspx page in global.asax在 global.asax 中压缩 aspx 页面时出现异常
【发布时间】:2012-07-06 05:19:36
【问题描述】:

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

谁能建议或解释我该怎么做。

【问题讨论】:

  • 您是否在集成模式下运行 IIS 7.5?
  • @jonVD 是的,我正在使用它。有关系吗?
  • 还有一个问题,这是 MVC 应用还是 webforms 应用?
  • 不,不是 mvc,只是普通的 webform 应用程序

标签: c# asp.net compression gzip


【解决方案1】:

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

您可以改用Server.MapPath()

【讨论】:

【解决方案2】:

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

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

为了解决这个问题,我建议让 IIS 压缩内容而不是手动进行,this 链接有详细信息可以帮助您入门,here 很好地概述了它可以产生的差异。

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

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

【讨论】:

  • 实际上我在 IIS 中使用重写模块。而且我无法启用动态压缩,因为它会出错。但我需要对从 aspx 页面生成的 html 进行压缩。 :(
  • 没关系,我经常在asp.net中使用我自己的压缩,唯一的区别是我使用的是MVC,我可以简单地将它作为一个ActionFilter。您将遇到的问题是,当您压缩内容时,您无法重新编写 url(它需要解压缩,重新编写,然后重新压缩)。这意味着压缩必须发生在重写之后才能正常工作。 forums.iis.net/t/1165899.aspx
猜你喜欢
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2010-09-13
  • 2020-06-27
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
相关资源
最近更新 更多