Answers:
Request.Redirect(url,false);
false
指示是否应终止当前页面的执行。
要变通解决此问题,请使用下列方法之一:
对于Response.End,请调用HttpContext.Current.ApplicationInstance.CompleteRequest() 方法而不是Response.End来将代码执行绕过 Application_EndRequest事件。
对于Response.Redirect,请使用重载Response.Redirect(String url,bool endResponse)来为endResponse参数传递false,以禁止对Response.End的内部调用。例如:如果您使用此替代方法,则会执行Response.Redirect之后的代码。
Response.Redirect ("nextpage.aspx", false);
对于Server.Transfer,请改用Server.Execute方法。
如果使用Response.End,Response.Redirect或Server.Transfer方法,则会发生ThreadAbortException异常。您可以使用try-catch语句来捕获此异常。
Response.End方法结束页面执行,并将执行转移到应用程序的事件管道中的Application_EndRequest事件。Response.End之后的代码行未执行。
由于两个方法都在内部调用Response.End,因此在Response.Redirect和Server.Transfer方法中会发生此问题。
此行为是设计使然。
文章ID:312629-最新评论:2012年8月30日-修订:4.0
适用于
- Microsoft ASP.NET 4.5
- Microsoft ASP.NET 4
- Microsoft ASP.NET 3.5
- Microsoft ASP.NET 2.0
- Microsoft ASP.NET 1.1
- Microsoft ASP.NET 1.0
关键字: kbexcepthandling kbprb KB312629
来源: PRB:如果您使用Response.End,Response.Redirect或Server.Transfer,则会发生ThreadAbortException
请检查此链接以了解此问题的原因以及错误的解决方案:
http://support.microsoft.com/kb/312629/EN-US/
Microsoft支持文章:
PRB:如果您使用Response.End,Response.Redirect或Server.Transfer,则会发生ThreadAbortException。
要变通解决此问题,请使用以下方法之一:对于Response.End,请调用HttpContext.Current.ApplicationInstance.CompleteRequest方法而不是Response.End,以将代码执行绕过Application_EndRequest事件。
对于Response.Redirect,请使用重载Response.Redirect(String url,bool endResponse),为endResponse参数传递false,以禁止内部调用Response.End。
例如:Response.Redirect(“ nextpage.aspx”,false);
如果您使用此替代方法,则会执行Response.Redirect之后的代码。对于Server.Transfer,请改用Server.Execute方法。
使用此代码解决问题:
string path = AppDomain.CurrentDomain.BaseDirectory.ToString() + "Uploadfile\\" + fileName;
System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] bt = new byte[fs.Length];
fs.Read(bt, 0, (int)fs.Length);
fs.Close();
Response.ContentType = "application/x-unknown/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName;+ "\"");
try
{
if (bt != null)
{
System.IO.MemoryStream stream1 = new System.IO.MemoryStream(bt, true);
stream1.Write(bt, 0, bt.Length);
Response.BinaryWrite(bt);
//Response.OutputStream.Write(bt, 0, (int)stream1.Length);
Response.Flush();
// Response.End();
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
throw ex;
}
finally
{
Response.End();
}
也可以使用 Server.Execute
如果您正在使用“更新面板”和链接按钮来下载excel,则在面板内部比添加回发触发器
<asp:PostBackTrigger ControlID="lnkTemplate" />
并在内部click事件背后的代码中
string ServerPath = System.Configuration.ConfigurationManager.AppSettings["FilePath"] + "Template.xlsx";
System.IO.FileInfo file = new System.IO.FileInfo(Server.MapPath(ServerPath));
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.TransmitFile(file.FullName);
HttpContext.Current.Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();
使用这个,对我来说总是有用的。
Response.Redirect(Request.RawUrl, false);
在这里,Response.Redirect(Request.RawUrl)仅重定向到当前上下文的url,而第二个参数“ false”则指示是否响应endResponse。