IIS 7删除Content-Type application / pdf的Content-Disposition文件名

时间:2015-05-07 08:45:42

标签: pdf iis content-type content-disposition

我有以下代码在我的Web应用程序中返回PDF文件:

string path = "help.pdf";
byte[] data = File.ReadAllBytes(path);
Response.Clear();
Response.ClearHeaders();
Response.AddHeader("Content-Length", data.Length.ToString());
Response.AddHeader("Content-Type", "application/pdf");
Response.AddHeader("Content-Disposition", "attachment; filename=help.pdf");
Response.OutputStream.Write(data, 0, data.Length);
Response.End();

当我在任何浏览器(Chrome,IE或Firefox)中调用此代码的处理程序时,我会看到一个“另存为...”对话框,其中包含页面名称(index.aspx)而不是名称在代码(help.pdf)中提供。

我还检查了以下内容:

  • 在我的本地计算机上测试过。它按预期在那里工作。
  • IIS中的停用压缩:无变化
  • IIS中已停用的SSL:无更改
  • IIS中已检查的MIME类型:已配置application / pdf
  • 将内容类型application/pdf替换为application/octet-stream:问题已经消失(但我们正在使用第三方导出工具,我无法以这种方式修改,因此这不是解决方案)

我检查了所有浏览器的HTTP响应标头。它看起来像这样:

Cache-Control:private
Content-Disposition:attachment
Content-Length:89407
Content-Type:application/pdf
Date:Thu, 07 May 2015 08:43:12 GMT
Server:Microsoft-IIS/7.5
X-Powered-By:ASP.NET
X-UA-Compatible:IE=edge,chrome=1

如您所见,从Content-Disposition字段中删除了filename参数。所以浏览器的行为是正确的。 Web服务器(IIS)似乎在修改标题。

我发现有人遇到同样的问题here。但问题从未解决过。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

问题在于,由于IIS 7.5 issue有人将以下行添加到应用程序的web.config文件中:

<outboundRules>
    <rule name="Force pdfs to download" preCondition="only match pdfs">
        <match serverVariable="RESPONSE_Content_Disposition" pattern="(.*)" />
        <action type="Rewrite" value="attachment" />
    </rule>
    <preConditions>
        <preCondition name="only match pdfs">
            <add input="{RESPONSE_CONTENT_TYPE}" pattern="^application/pdf" />
        </preCondition>
    </preConditions>
</outboundRules>