2

我有一个具有单页方法的网络表单。我的其他 Web 应用程序将未处理的异常记录到 Web 服务器上的系统事件日志中。由于与我合作的其他开发人员希望在事件日志中看到应用程序错误条目,我希望这个应用程序也能这样做。

但是,当从页面方法内的调用代码中捕获异常时,我让应用程序发送错误电子邮件。发生这种情况时,它不会写入事件日志。注意:页面方法在调用我的邮件通知方法后重新抛出异常。

从我目前阅读的内容来看,ASP.Net 似乎默认将错误记录到事件日志中。我想页面方法/WebMethods 并非如此,因为它们基本上将异常抛出给调用它的客户端代码。

是否有一种简单的方法可以使该异常正确冒泡以便写入事件日志?没有其他应用程序直接从我所看到的内容写入事件日志,所以我认为该应用程序不会创建新源,因为我们的安全人员将很多事情锁定(出于善意,是的安全)。

[WebMethod]
public static object MyPseudoWebMethod()
{
    try
    {
        // My exception spawning unreliable code here
    }
    catch(Exception ex)
    {
        // Cleanup ...
        this.SendErrorNotification(ex);

        throw; // <-- This doesn't bubble up but I'd love for it to!
    }
}
4

2 回答 2

1

嗯有趣的问题。你是对的,WebMethod 异常不遵循正常的异常流程。

如果您的 Web 方法引发异常,则不会触发 Application_Error 事件。这样做的原因是 XML Web services 的 HTTP 处理程序使用 XML Web services 执行时发生的任何异常,并在调用 Application_Error 事件之前将其转换为 SOAP 错误。

(从这里

上面的页面建议使用 SOAP 扩展在它被吞下之前捕获该异常,但如果你不想这样做,我会这样做:

1) 制作一个新的“错误接收”ASPX 页面,您将构建该页面将采用您想要在错误日志中记录的任何参数。因此,例如,让此页面接收名为“ExceptionDetails”的 POST 或您希望捕获的任何其他内容。此页面不会直接在浏览器中查看,因此它不需要任何 ASPX 控件或任何东西,但在其上使用 MasterPage 不会有任何损害。

2) 在这个新页面后面的代码中,获取您发送的任何 POSTS,并使用您需要的任何详细信息新建一个异常。立即抛出此异常。这样做意味着此异常将遵循应用程序中其他未处理异常的任何流程(日志记录、电子邮件发送等)。

3)在调用WebMethod JS的页面上,将对WebMethod的调用包装在try-catch中

4) 在 catch 块中,在浏览器中打印出您想要的任何消息,并启动一个新的 AJAX 帖子到接收 ASPX 页面的新错误,传递您让该页面查找的任何 POST 内容。

默认情况下,新的 AJAX 调用不会改变用户的感知。AJAX 调用会触发对该页面的新请求,而 ASPX 页面本身实际上完全不知道它的 AJAX 而不是正常的浏览器请求。如果您正在记录用户的 ID 或其他任何内容,则当前设置的任何 cookie/会话/身份验证数据也可用于 AJAX 页面。如果您查看像 Firebug 这样的工具返回的响应,您会发现它实际上是 YellowScreenOfDeath 的 HTML(除非您有一个自定义的 500 页面,在这种情况下,它是返回的那个 HTML)。

于 2012-11-08T20:23:10.733 回答
0

这就是传统 ASMX Web 服务的工作方式。

唯一的解决方法是停止使用它们(无论如何你都应该这样做,除非你坚持使用 .NET 2.0)。WCF 没有这个问题。

于 2012-11-08T19:00:01.347 回答