Response.End()生成的异常

时间:2013-10-06 07:32:36

标签: c# asp.net webforms

我使用以下代码让用户下载文件。它工作正常,但也会生成错误,错误来源为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);,但它也不起作用。

由于

2 个答案:

答案 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() 

阅读Is Response.End() considered harmful?