c# - 单击使用 HttpResponse.WriteFile 下载文件所需的重试

标签 c# internet-explorer

我有一个网站,我试图通过 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() 替换 HttpResponseClose()End() 调用>.

Read here why ,也有例子。

此外,还建议使用此解决方案 here (在第一个答案中)与您的情况类似。

正如暗示的那样,由于链接在未来可能会失效,因此在这篇文章中进行一个小的解释会很方便,这里是:

简而言之:IE 的HttpResponse.CloseHttpResponse.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/

相关文章:

c# - 获取 Entity Framework 7 中已修改对象的列表

css - Bootstrap IE 背景颜色问题

css - Logo 绝对定位不适用于 Firefox 和 IE

c# - .Net Core 1.1 中的传递引用

c# - 了解丰富的领域模型和依赖关系

javascript - 条件 IF 语句 - if 现代浏览器

javascript - IE 中的命名函数表达式,第 2 部分

Javascript IE 检测,为什么不用简单的条件注释?

c# - 我如何从客户端计算机上的 VBScript 访问 C# dll

c# - 使用 FetchXML 获取(强类型)相关实体