C# 单击使用HttpResponse.WriteFile下载文件所需的重试
我有一个网站,我试图通过WriteFile交付文件,它们在Chrome和Firefox中运行良好,但在IE中,我必须点击“重试”一两次才能真正下载文件 代码如下: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
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版本是什么?如何调用文件下载?它是通过客户端代码还是服务器端代码实现的?虽然你的答案有一个很好的观点,但你可能想给出一个(非常)简短的解释,因为某个链接可能会在某个时候失效。好的,你是对的,链接失效的可能性。我补充了一个简短的解释