none
使用Response返回1或者0的时候,为什么网页会弹出异常信息呢? RRS feed

  • 问题

  • 我使用Response.Clear();

    Response.Write("0/1");

    Response.End(); 返回1或者0 的时候,在Response.End()处VS2008编译环境获取到异常,为什么呢?

    2010年4月6日 1:28

答案

  • 你好,

                try
                {

                    if (true)
                    {
                        Response.Clear();
                        Response.Write("1");
                        HttpContext.Current.ApplicationInstance.CompleteRequest();
                    }
                    else if (false)
                    {

                        Response.Clear();
                        Response.Write("1");
                        HttpContext.Current.ApplicationInstance.CompleteRequest();
                    }
                }
                catch (Exception ex)
                {
                    Response.Clear();
                    Response.Write(ex.Message);
                    HttpContext.Current.ApplicationInstance.CompleteRequest();
                }

    如果使用 Response.End、Response.Redirect 或 Server.Transfer 方法,将出现 ThreadAbortException(线程终止异常) 异常。您可以使用 try-catch 语句捕获此异常。

    Response.End 方法终止页的执行,并将此执行切换到应用程序的事件管线中的 Application_EndRequest 事件。不执行 Response.End 后面的代码行。

    此问题出现在 Response.Redirect 和 Server.Transfer 方法中,因为这两种方法均在内部调用 Response.End。

    对于 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);

    这种行为是设计导致的。

    2010年4月6日 3:44
    版主

全部回复

  • 我这边正常。

    你关掉vs,重新试下。

    2010年4月6日 2:14
  • 你好!

    这部分代码没有问题,这可能是你其它代码所致。方便的话把你完整的代码帖出来吧。


    知识改变命运,奋斗成就人生!
    2010年4月6日 3:01
    版主
  •  try
                    {

                        if (cArray.Length == 18)
                        {
                            Response.Clear();
                            Response.Write(‘1’);
                            Response.End();
                        }
                        else if (cArray.Length == 5)
                        {

                            Response.Clear();
                            Response.Write(‘1’);
                            Response.End();
                        }
                    }
                    catch (Exception ex)
                    {
                        Response.Clear();
                        Response.Write(‘0’);
                        Response.End();
                        Log2File.Log(DateTime.Now.ToString(), ex.Message);
                    }

    我在调试环境下跟踪,在Response.End(); 处捕获到得异常!请高人指点有问题吗?

    2010年4月6日 3:08
  • 可以把你出错的信息发出来吗?
    2010年4月6日 3:13
  • 你好,

                try
                {

                    if (true)
                    {
                        Response.Clear();
                        Response.Write("1");
                        HttpContext.Current.ApplicationInstance.CompleteRequest();
                    }
                    else if (false)
                    {

                        Response.Clear();
                        Response.Write("1");
                        HttpContext.Current.ApplicationInstance.CompleteRequest();
                    }
                }
                catch (Exception ex)
                {
                    Response.Clear();
                    Response.Write(ex.Message);
                    HttpContext.Current.ApplicationInstance.CompleteRequest();
                }

    如果使用 Response.End、Response.Redirect 或 Server.Transfer 方法,将出现 ThreadAbortException(线程终止异常) 异常。您可以使用 try-catch 语句捕获此异常。

    Response.End 方法终止页的执行,并将此执行切换到应用程序的事件管线中的 Application_EndRequest 事件。不执行 Response.End 后面的代码行。

    此问题出现在 Response.Redirect 和 Server.Transfer 方法中,因为这两种方法均在内部调用 Response.End。

    对于 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);

    这种行为是设计导致的。

    2010年4月6日 3:44
    版主
  • (补充)

    对于 Server.Transfer,请改用 Server.Execute 方法。

    2010年4月6日 3:46
    版主