剥离Cache-control和Pragma:no-cache http头而不使用Http Module

时间:2014-01-03 11:33:10

标签: asp.net https webforms http-headers iis-7.5

问题: 我们有一个.aspx aka WebForms页面,使用户能够将显示的报告下载为MS-Excel下载。此页面作为Web应用程序的一部分以及桌面应用程序中的浏览器框架(ieframe)内部提供。

  1. 下载适用于所有浏览器以及浏览器框架内的HTTP。
  2. 当我们切换到HTTPS(在生产环境中)时,下载拒绝工作
  3. SO Question详细说明了问题和原因。

    由于解决方案涉及剥离Cache-control:no-cache和Pragma:no-cache,我编写了一个Http模块来实现这一点。

    建议的解决方案

    HttpModule基本上是使用PreSendRequestHeaders事件执行此操作:

    private void OnPreSendRequestHeaders(object sender, EventArgs e)
            {
                if (null == _httpApplication)
                {
                    return;
                }
    
                if (_httpApplication.Context != null)
                {
                    var response = _httpApplication.Response;
                    if (_httpApplication.Request.Url.AbsoluteUri.ToLowerInvariant().Contains("mypage.aspx"))
                    {
                        HeadersToCloak.ForEach(header => response.Headers.Remove(header));
                        response.Headers.Add("Cache-Control", "private, max-age=15");
                    }
                }
            }
    

    争用之骨: 在代码审查期间,我被告知这不是一个好的解决方案,因为我的自定义模块将针对所有请求运行,因此会影响性能。 应用程序的web.config在system.webServer节点下具有runAllManagedModulesForAllRequests =“true”,这是应用程序所需的其他功能所必需的。

    我尝试了什么

    1. 尝试将代码放在ASPX页面本身的几个事件(逐个)中删除和添加标题,包括RenderComplete,但是当我在Fiddler中检查响应时,麻烦的标题仍然存在(没有替换为预期的标题) )
    2. 我已按照HERE的说明查找了preCondition标记,但由于我们在集成管道模式下运行并且runAllManagedModulesForAllRequests =“true”,因此preCondition将毫无意义
    3. 需要帮助的问题:

      Q1)鉴于该模块将针对包括静态文件在内的所有请求运行,并且只有在请求的URI用于相关页面时才进行实际工作,运行此模块会对性能产生多大影响?

      Q2)如何以其他方式删除和设置仅一页的标题?

      Q3)鉴于这些限制,是否可以仅针对托管请求或仅针对我的页面运行此模块(不要认为后者是可能的)?

1 个答案:

答案 0 :(得分:0)

商定的解决方案如下:

1)将需要strip-headers功能的页面集移动到根应用程序下的各自单独的文件夹中

2)在此文件夹中放置一个web.config,其中包含system.webServer下的以下设置:

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="HeaderStripModule" />
      <add name="HeaderStripModule" type="Com.Reports.HeaderStripModule" />
    </modules>
  </system.webServer>

在root web.config中,放置此设置:

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="HeaderStripModule" />          
    </modules>
  </system.webServer>

在这些更改后,我通过fiddler进行了验证,发现模块(预期)仅针对文件夹中的页面运行(在IIS下设置为应用程序)。