IIS 7 删除 Content-Disposition 文件名 Content-Type application/pdf
IIS 7 removes Content-Disposition filename for Content-Type application/pdf
我有以下代码 returns 我的网络应用程序中的 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
) 的 "Save as..." 对话框而不是代码中提供的名称 (help.pdf
).
我还检查了以下内容:
- 在我的本地机器上测试过。它在那里按预期工作。
- 在 IIS 中停用压缩:无变化
- 在 IIS 中停用 SSL:无变化
- 已检查 IIS 中的 MIME 类型:application/pdf 已配置
- Replaced Content-Type
application/pdf
with application/octet-stream
: 问题解决了(但我们使用的是第三方导出工具,我无法通过这种方式修改,所以这不是解决方案)
我检查了所有浏览器的 HTTP 响应 header。看起来像这样:
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 字段中删除。所以浏览器的行为是正确的。 Web 服务器 (IIS) 似乎在修补 header.
我发现有人有同样的问题here。但问题一直没有解决。有什么想法吗?
问题是因为 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>
我有以下代码 returns 我的网络应用程序中的 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
) 的 "Save as..." 对话框而不是代码中提供的名称 (help.pdf
).
我还检查了以下内容:
- 在我的本地机器上测试过。它在那里按预期工作。
- 在 IIS 中停用压缩:无变化
- 在 IIS 中停用 SSL:无变化
- 已检查 IIS 中的 MIME 类型:application/pdf 已配置
- Replaced Content-Type
application/pdf
withapplication/octet-stream
: 问题解决了(但我们使用的是第三方导出工具,我无法通过这种方式修改,所以这不是解决方案)
我检查了所有浏览器的 HTTP 响应 header。看起来像这样:
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 字段中删除。所以浏览器的行为是正确的。 Web 服务器 (IIS) 似乎在修补 header.
我发现有人有同样的问题here。但问题一直没有解决。有什么想法吗?
问题是因为 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>