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

IIS 7 删除了 Content-Type application/pdf 的 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)。

我使用所有浏览器检查了 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

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

我发现有人有同样的问题这里。但问题始终没有解决。有什么想法吗?

笔记:修改代码不是解决办法。我们网站上有第三方控件(Telerik RadGrid),它们的“导出为 PDF”功能也存在同样的问题。

答案1

问题是由于IIS 7.5 问题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>

相关内容