问题: 我们有一个.aspx aka WebForms页面,使用户能够将显示的报告下载为MS-Excel下载。此页面作为Web应用程序的一部分以及桌面应用程序中的浏览器框架(ieframe)内部提供。
此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”,这是应用程序所需的其他功能所必需的。
我尝试了什么:
需要帮助的问题:
Q1)鉴于该模块将针对包括静态文件在内的所有请求运行,并且只有在请求的URI用于相关页面时才进行实际工作,运行此模块会对性能产生多大影响?
Q2)如何以其他方式删除和设置仅一页的标题?
Q3)鉴于这些限制,是否可以仅针对托管请求或仅针对我的页面运行此模块(不要认为后者是可能的)?
答案 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下设置为应用程序)。