【问题标题】:How to handle exceptions during an ASP.NET request lifecycle如何在 ASP.NET 请求生命周期中处理异常
【发布时间】:2010-10-10 07:05:54
【问题描述】:

这个问题与Handle URI hacking gracefully in ASP.NET 有点相关,因为它也是关于如何最好地处理在 ASP.NET 请求生命周期中发生的异常。我找到了一种优雅地处理大多数异常的方法,但后来我发现一些异常在请求中发生得太晚了,以至于无法执行Server.Transfer 之类的操作来将整个错误表示逻辑划分到它自己的页面中。

所以,我必须改为处理 Application_Error 事件中的异常,然后执行 Response.Writes 之类的。它很丑。我知道在某些情况下响应流可能已经被刷新,因此传输请求并不是一个真正的选择。我想问的是,是否有人找到了解决这个问题的优雅方法?

此外,我发现很难知道何时可以通过将请求转移到另一个页面而不是正常地处理异常。当异常发生时,找出我们在请求生命周期中的哪个位置的最佳方法是什么?如果它发生在页面的加载和呈现期间,Page_Error 将能够处理它,而我在处理Server.Transfer 时还没有遇到问题。但是,如果异常发生得太早或太晚,Page_Error 无法捕获它并冒泡到Application_Error,我该怎么做才能知道它是早还是晚?

如果在生命周期的后期,我可能不得不直接从Application_Error 执行Response.Write,但如果它是早期的,我可以执行Server.Transfer。问题是尝试执行Server.Transfer 本身会导致异常,如果它太在请求中执行它。

那么,是否有一个全局枚举或类似的东西可以表明现在是否为时已晚对响应进行创造性的处理?

【问题讨论】:

    标签: asp.net exception-handling error-handling lifecycle


    【解决方案1】:

    我已经使用这种方法来捕获生成的所有错误,无论是在 Web 控件还是页面中。它需要您做的就是从一个基类(一个用于页面,一个用于用户控件)继承,每个页面或用户控件都可以实现自己的 HandleException 方法并执行它需要执行的任何操作。 完整代码在这里:

    Transparent generic exception handling for asp.net / MOSS2007 (with code)

    【讨论】:

      【解决方案2】:

      我认为我的建议是使用带有 WMI 事件提供程序的 ASP.NET 健康监控来解决错误:

      这里有一个方法。

      http://msdn.microsoft.com/en-us/library/ms178713.aspx

      希望这会有所帮助:

      安德鲁

      【讨论】:

      • 您好,感谢您的建议。外部控制台应用程序并没有真正的帮助,因为我想要的不仅是捕获错误(我已经做得很好了),而且还显示一个友好的错误消息。
      • 您是否在使用自定义错误页面?这允许您根据任何请求的结果抛出的任何 Http 状态代码显示自定义信息?
      • ASP.NET 将所有请求重定向到错误页面(例如,而不是执行 Server.Transfer),因此无法使用。
      【解决方案3】:

      我建议您使用 asp.net 配置为未处理的异常设置一个常规错误页面。来自示例 web.config

          <!--
              The <customErrors> section enables configuration 
              of what to do if/when an unhandled error occurs 
              during the execution of a request. Specifically, 
              it enables developers to configure html error pages 
              to be displayed in place of a error stack trace.
      
          <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
              <error statusCode="403" redirect="NoAccess.htm" />
              <error statusCode="404" redirect="FileNotFound.htm" />
          </customErrors>
          -->
      

      在整个处理程序上,只需记录异常,然后让 asp.net 进行重定向。

      如果您仍想继续使用客户方法,我建议您查看可用的 asp.net 源并检查它是如何做到的。

      【讨论】:

      • ASP.NET 的自定义错误完全没有用,因为它会将用户物理重定向(通过 301 或 302 响应代码)到新 URL。基本的 RESTful 设计和常识表明 URL 应该保持不变以反映失败的资源;重定向完全打破了这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多