我使用以下代码让用户下载文件。它工作正常,但也会生成错误,错误来源为Response.End();
错误消息:无法评估表达式,因为代码已优化或本机框架位于调用堆栈之上。
以下是我的代码。我如何处理此错误,并且此错误不会释放我的资源,这可能导致不必要的内存使用。
我将它用于asp.net webform应用程序。
try
{
string fileName = Request["file_ID"];
string path = Server.MapPath("~/App_Data/uploads/"+fileName);
//string = Server.MapPath(strRequest);
System.IO.FileInfo file = new System.IO.FileInfo(path);
if (file.Exists)
{
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/"+file.Extension;
Response.WriteFile(file.FullName);
Response.End();
// System.Threading.Thread.Sleep(2000);
// Page.ClientScript.RegisterStartupScript(this.GetType(), "MyScript", "alert('aa')", true);
}
else
{
//Page.ClientScript.RegisterStartupScript(this.GetType(), "MyScript", "myWindow.close();", true);
}
}
catch (Exception rt)
{
Response.Write(rt.Message);
}
}
我正在考虑这个解决方案,但我不确定如何在我的代码中实现它。
Unable to evaluate expression... on web page
更新:
我实际上希望用户下载文件并使用脚本后面的代码关闭相同的代码。
所以我不确定如何更好地优化此代码来处理response.end语句生成的异常。
我尝试使用Page.ClientScript.RegisterStartupScript(this.GetType(), "MyScript", "myWindow.close();", true);
,但它也不起作用。
由于
答案 0 :(得分:1)
另一个答案似乎是说你可以不使用Response.End,因为它是不必要的,或者为你有当前捕获的ThreadAbortException添加一个catch
问题链接到another question,建议添加以下内容:
// Sends the response buffer
Response.Flush()
// Prevents any other content from being sent to the browser
Response.SuppressContent = TrueResponse.SuppressContent = True
答案 1 :(得分:1)
使用HttpContext.Current.ApplicationInstance.CompleteRequest
或尝试一样的东西
Response.OutputStream.Flush()
Response.OutputStream.Close()
Response.Flush()
Response.End()