【问题标题】:Cannot Transfer request to Desired ASP.NET Error Page无法将请求传输到所需的 ASP.NET 错误页面
【发布时间】:2009-07-26 17:07:33
【问题描述】:

在 Page_Load() 部分,我检查有效输入,如果它们无效,我将请求转移到自定义错误页面。

这样做时,会抛出一个 ThreadAbortException,它被我的 catch 块捕获,但 asp.net 将请求传输到未知异常页面。 我究竟做错了什么?当我转移到错误页面时,我不希望出现 ThreadAbortException。 例如:

     protected void Page_Load(object sender, EventArgs e)
  {

    try
    {
                    if (String.IsNullOrEmpty(szProductName))
                      {
                        //Product name not given. Hence cant process further.
                        Server.Transfer(Constants.ERROR_WRONG_INPUTS_ASPX);
                      }
                    else
                        {
                          //Do something.....
                        }
    }
    catch(Exception Ex)
    {

    }

  }

作为一种解决方法,我现在使用:

Response.Redirect(Constants.ERROR_WRONG_INPUTS_ASPX, false);

而不是 Server.Transfer,即我允许进程在后台继续,这需要我检查有效性,然后只执行剩余的代码。

我的问题类似于:Exception Handling Application Block Exception Handler running in ASP.NET cannot call Response.End() 但似乎没有得到回答。

【问题讨论】:

    标签: asp.net c#-2.0


    【解决方案1】:

    Response.Redirect 引发 ThreadAbortException 以中止当前页面并将控制权转移到新页面。添加 false 参数“修复”了这个问题,因为它告诉 Response.Redirect 在转移控制之前完成当前页面上的处理。

    我相信尽管您需要查看您的应用程序流程。由于输入错误而将页面转移到错误页面似乎是一种处理输入验证的过于复杂的方法。我认为您最好使用显示消息的回发,或者在页面发布之前在 javascript 中进行一些验证。

    【讨论】:

    • 问题是用户会带着一个链接来到我的页面:MyServer/MySite/Details.aspx?ProductName=FireFox。因此,只有当他的请求到达我的服务器时,我才能检查产品是否有效。如果他没有输入产品名称,我需要告诉他他输入了错误的输入(也是错误产品的情况)。我无法帮助用户输入错误的产品名称/无名称,因为这超出了我的控制范围。有什么建议吗?
    • 如果确实是无效的情况,我会抛出一个错误并让应用程序错误处理接管。特别是如果错误意味着调用应用程序存在问题。或者,如果这不是一个选项,我会返回调用应用程序来确定问题。
    【解决方案2】:

    只要调用 Response.End(),就会发生 ThreadAbortException。 Server.Transfer 在内部调用 Response.End() 因为它立即结束当前处理并将请求交给新页面,新页面负责将信息返回给浏览器。

    Response.Redirect 更加优雅,因为它完成了当前请求的处理并向客户端返回 301 Redirect 响应。通常这会导致浏览器向服务器发出第二次请求以请求重定向 URL。

    你说它正在转移到一个未知的错误页面,但我不知道为什么。您是否在 Global.asax 的 Application_Error 方法中这样做?如果错误得到处理,您应该能够控制它的去向。

    【讨论】:

    • 它重定向到我在 web.config 中设置的默认错误页面:
    【解决方案3】:

    我建议你摆脱那个 try...catch 块。你期望在那里捕捉到什么?如果您真的期望某些取决于您的实现的特殊情况,那将在您的 else 块内进一步发生。所以你应该用 try...finally 来包装它。

    ASP.NET 在结束您的请求时会抛出 ThreadAbortException,但它最终会在调用堆栈的上层捕获它,因此您不应该自己捕获它。如果您期待其他一些可能的状态损坏,只需让它传播到全局异常处理程序;抛出的不是你的代码。

    【讨论】:

      【解决方案4】:

      如果某个产品丢失或该产品不在您的数据存储中,那么您可能需要考虑返回 404(未找到页面)。这表明浏览器——(以及谷歌搜索蜘蛛!)——没有这样的页面。您是否打算使用 SEO 友好的 URL,例如: http://MyServer/MySite/Products/FireFox?

      【讨论】:

      • 当我遇到这个问题时,我正在从事的项目早已死去。无论如何,它是一个 Intranet 网站。
      猜你喜欢
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      相关资源
      最近更新 更多