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

C# 单击使用HttpResponse.WriteFile下载文件所需的重试,c#,internet-explorer,C#,Internet Explorer,我有一个网站,我试图通过WriteFile交付文件,它们在Chrome和Firefox中运行良好,但在IE中,我必须点击“重试”一两次才能真正下载文件 代码如下: public class DownloadHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { var r = context.Response; r.Clear(); r.C

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

,也有例子

此外,在第一个答案中,针对与您类似的情况提出了此解决方案

正如有人暗示的,在这篇文章中,一个小的解释会很方便,因为链接将来可能会消亡,下面是:

简言之:IE似乎在HttpResponse.Close和HttpResponse.End方法方面存在问题。除此之外,无论如何,在大多数情况下,微软建议使用HttpApplication.CompleteRequest而不是前两种,因为:

-HttpResponse.Close()突然终止连接,丢弃缓冲数据,不适用于需要响应客户端的正常HTTP使用

-HttpResponse.End()的存在是为了与旧的ASP技术兼容。它直接调用EndRequest事件,并且在执行End调用后没有进一步的代码,这在许多情况下是不方便的


-HttpApplication.CompleteRequest():还执行EndRequest事件,它确实允许执行CompleteRequest调用之后的代码,这使得它更适合处理大多数情况。

只是一种预感,但对我来说这听起来像是一个I.E.缓存问题

如果I.E设置为“每次访问网站时”自动检查较新页面(在[tools\internet options\general\browsing history\settings]中),则不会出现缓存问题。 就像我说的,只是一种预感,但试一下

如果要绕过此[*1],请向查询字符串添加guid。[*2]

[*1]缓存设置是逐用户设置的,您永远不能抢占用户设置,因此请使用它们

[*2]nocache值总是不同的,浏览器永远不会有缓存版本

我用这样的东西

protected void Page_PreRender(object sender, EventArgs e)
        {
            if (HttpContext.Current.Request.QueryString["FirstRun"] == "1")
            {
                NameValueCollection nvc = HttpUtility.ParseQueryString(Request.Url.Query);
                nvc.Remove("FirstRun");
                string url = Request.Url.AbsolutePath;
                for (int i = 0; i < nvc.Count; i++)
                    url += string.Format("{0}{1}={2}", (i == 0 ? "?" : "&"), nvc.Keys[i], nvc[i]);
                Response.Redirect(string.Format("{1}&NoCache={0}",System.Guid.NewGuid().ToString().Replace("-",""),url));
            }
        }
受保护的无效页面\u预呈现(对象发送方,事件参数e)
{
if(HttpContext.Current.Request.QueryString[“FirstRun”]=“1”)
{
NameValueCollection nvc=HttpUtility.ParseQueryString(Request.Url.Query);
nvc.移除(“首次运行”);
字符串url=Request.url.AbsolutePath;
对于(int i=0;i
任何指向此页面的链接/重定向都需要附加到查询字符串中?FirstRun=1(或&FirstRun=1)。向querystring添加&noCache值后,页面重新加载将自行循环

注: 因为您添加了FirstRun=1,所以它将始终在服务器端执行两次,但对您的用户和浏览器来说,它看起来就像一个加载


如果不添加FirstRun=1,它将像普通请求一样运行,因为它永远不会进入该条件。

您使用的IE版本是什么?如何调用文件下载?它是通过客户端代码还是服务器端代码实现的?虽然你的答案有一个很好的观点,但你可能想给出一个(非常)简短的解释,因为某个链接可能会在某个时候失效。好的,你是对的,链接失效的可能性。我补充了一个简短的解释