有许多(很多)SO和其他关于正确使用Response.End()
的线程,但是,似乎没有一个与我们在多年未改变的代码中看到的行为相匹配。 / p>
行为:下载文件时,页面的HTML内容将附加到文件内容中。
项目类型: WebForms
.NET版本: 4.6.2 | 4.5.0 | 4.0.0
VS版本: 2015 | 2013 | 2012年(启用/不启用安全模式)
WebHost: IIS Express(默认设置)
创建一个空白的WebForms项目。删除所有引用但<; p>
Default.aspx(默认模板规定)
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestDownload2.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Sample page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:Button ID="_uiExportBtn" runat="server" Text="Download" OnClick="_uiExportBtn_Click" />
</form>
</body>
</html>
Default.aspx.cs
namespace TestDownload
{
using System;
using System.IO;
using System.Threading;
public partial class _Default : Page
{
protected void _uiExportBtn_OnClick(object sender, EventArgs e)
{
try
{
string filePath = Server.MapPath("~/File1.txt");
FileInfo fileDetails = new FileInfo(filePath);
Response.Clear();
Response.AddHeader("Content-Disposition",
"attachment; filename=" + Path.GetFileName(filePath)); // strip out the path
Response.AddHeader("Content-Length", fileDetails.Length.ToString());
Response.ContentType = "text/plain";
Response.WriteFile(filePath);
Response.Flush();
Response.End();
}
catch (ThreadAbortException)
{
Thread.ResetAbort();
}
}
}
}
File1.txt的内容
File with sample data that can be downloaded.
点击下载时的文件内容;
File with sample data that can be downloaded.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
Sample page
</title></head>
<body>
<form method="post" action="./Default.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTQ2OTkzNDMyMWRk3Rw04QLdhpy5d4I1K2wRBGQwJyDyRwQJv3qrWVnmZOk=" />
</div>
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="CA0B0334" />
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdAAIM+aT11BIx7AHRURAAeZqgtB4HvaHnJdET69NHLAgDcsjxSqzk6G3joivJ/c73mKUQf4CSnfdxrC8NepO7KQg3" />
</div>
<input type="submit" name="_uiExportBtn" value="Download" id="_uiExportBtn" />
</form>
</body>
</html>
修改 经过大量的不同浏览器试验,VS版本,.NET版本试图缩小范围,看来问题是在IIS上注册的指定MIME类型。
这似乎是我第二次遇到this issue。我使用了类似的解决方法,但我仍然因为原因而感到神秘。
答案 0 :(得分:0)
在做了更多研究之后,我想我可以提供一个可能的解释,说明为什么我们得到上述行为。根据{{3}}指定如何设置MIME类型以及浏览器如何解释它们,通过在我的文件中指定text/palin
或text/csv
,浏览器将其解释为与{{{{}}相同1}}(已经显示的页面)并将当前页面内容添加到文件的HTTP响应中。
重要的是要注意附加的HTML实际上并不是作为文件响应的一部分传输的,如果浏览器认为文件与页面的内容类型相同,浏览器仍会附加它。
关于解决方案并继续本文所描述的内容,为了将文件与HTTP响应的其余部分分开,应将其标记为text/html
,特别是在文件实际包含非常容易解释为HTML内容的文本的情况下,例如application/octet-stream
或.txt
文件。