我有一个网站,我试图通过 WriteFile 传送文件,它们在 Chrome 和 Firefox 中工作正常,但在 IE 中,我必须点击“重试”一次或两次才能真正下载文件。
代码如下:
public class DownloadHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
var r = context.Response;
r.Clear();
r.ClearContent();
r.ContentType = "application/octet-stream";
string path = "";
try
{
if (HttpContext.Current.Request.QueryString["n"] != null)
{
var file = HttpContext.Current.Request.QueryString["n"].ToString();
var type = HttpContext.Current.Request.QueryString["t"].ToString();
r.AddHeader("Content-Disposition", "attachment; filename=" + file.Substring(file.IndexOf('_')+1));
string folder = "";
switch (type.ToLower())
{
case "public":
folder = ConfigurationManager.AppSettings["BCD_PublicDocsLoc"];
break;
case "private":
folder = ConfigurationManager.AppSettings["BCD_PrivateDocsLoc"];
break;
case "internal":
folder = ConfigurationManager.AppSettings["BCD_InternalDocsLoc"];
break;
}
path = folder + "/" + file;
r.WriteFile(path);
r.Flush();
r.Close();
r.End();
}
}
catch (Exception ex)
{
r.Flush();
r.Close();
r.End();
context.Response.Redirect("Error.aspx?err=301");
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
如果有人对发生这种情况的原因有任何建议,我们将不胜感激。谢谢!
最佳答案
尝试用 HttpApplication.CompleteRequest() 替换 HttpResponse 的 Close() 和 End() 调用>.
Read here why ,也有例子。
此外,还建议使用此解决方案 here (在第一个答案中)与您的情况类似。
正如暗示的那样,由于链接在未来可能会失效,因此在这篇文章中进行一个小的解释会很方便,这里是:
简而言之:IE 的HttpResponse.Close 和HttpResponse.End 方法似乎有问题。除此之外,无论如何,Microsoft 建议在大多数情况下使用 HttpApplication.CompleteRequest 而不是前两者,因为:
-HttpResponse.Close() 突然终止连接,丢弃缓冲数据,不适用于需要响应客户端的正常 HTTP 使用
-HttpResponse.End() 的存在是为了与旧的 ASP 技术兼容。它直接调用 EndRequest 事件,在执行 End 调用后没有进一步的代码,这在很多情况下是不方便的
-HttpApplication.CompleteRequest():还执行 EndRequest 事件,它确实允许执行 CompleteRequest 调用之后的代码,这使得它更适合处理大多数情况。
关于c# - 单击使用 HttpResponse.WriteFile 下载文件所需的重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27947210/