我有一个具有单页方法的网络表单。我的其他Web应用程序会记录Web服务器上系统事件日志的未处理异常。由于与我合作的其他开发人员希望在事件日志中看到应用程序错误的条目,我希望这个应用程序也能这样做。
但是,当从页面方法中调用代码捕获到异常时,我有应用程序发送错误电子邮件。发生这种情况时,它不会写入事件日志。注意:调用我的电子邮件通知方法后,页面方法会重新抛出异常。
从我到目前为止看来,ASP.Net似乎默认情况下会将错误记录到事件日志中。我认为Page Methods / 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!
}
}
答案 0 :(得分:1)
嗯有趣的问题。你是对的,因为WebMethod异常不遵循正常的异常流程。
如果您的Web方法抛出,则不会触发Application_Error事件 例外。原因是XML Web的HTTP处理程序 服务消耗XML Web服务时发生的任何异常 正在执行并在之前将其转换为SOAP错误 调用Application_Error事件。
(来自here)
上面的页面建议使用SOAP扩展来在吞下之前捕获该异常,但是如果您不想这样做,我会这样做:
1)创建一个新的“错误接收”ASPX页面,您将构建该页面,该页面将包含您要在错误日志中记录的任何参数。因此,例如,让此页面采用名为“ExceptionDetails”的POST或您想要捕获的任何其他内容。此页面不会直接在浏览器中查看,因此它不需要任何ASPX控件或任何东西,但在其上使用MasterPage不会伤害任何东西。
2)在这个新页面背后的代码中,抓住你要发送的任何POSTS,并用你需要的任何细节新增一个Exception。立即抛出此异常。这样做意味着此异常将遵循应用程序中跟随的其他未处理异常的任何流程(日志记录,电子邮件等)。
3)在调用WebMethod JS的页面上,在try-catch中包含对WebMethod的调用
4)在catch块中,在浏览器中打印出你想要的任何消息,然后向接收ASPX页面的新错误发起一个新的AJAX帖子,传递你在该页面上查找的任何POST内容。
默认情况下,新的AJAX调用不会改变用户感知中的任何内容。 AJAX调用会触发对该页面的新请求,而ASPX页面本身实际上完全没有意识到它的AJAX而不是正常的浏览器请求。如果您正在记录用户的ID或任何内容,那么当前设置的任何cookie /会话/认证数据也可用于AJAXed页面。如果你看一下像Firebug这样的工具返回的响应,你会看到它实际上是YellowScreenOfDeath的HTML(除非你有一个自定义的500页面,在这种情况下它会回来的那个HTML)。
答案 1 :(得分:0)
这就是传统ASMX Web服务的工作原理。
唯一的解决方法是停止使用它们(除非你坚持使用.NET 2.0,否则你应该这样做)。 WCF没有这个问题。