2009-07-10 153 views
5

从问题here继让我思考....传递一个异常对象到WebService

会是/是有可能的是,当应用程序遇到未处理的异常此异常对象序列化和发送到具有db后端的Web服务。然后,使用一个实用程序,甚至在Visual Studio中,异常对象可以从数据库中加载并检查?

这可能吗?我想第一个问题是你是否可以序列化异常对象。

回答

-1

这没有必要。只需记录异常。

如果您想将其记录到数据库,请继续。您可以为此使用企业库日志记录应用程序块。

+0

是的,您可以将异常记录到磁盘,但对于开发人员而言,如果他们无法访问发生异常的计算机,那么该异常并不是非常有用。这个想法是1)通知开发者发生了错误,并且2)给他们提供尽可能多的信息,使他们能够追踪问题,而不是收到一封电子邮件,说“你的应用程序崩溃了” – Calanus 2009-07-10 14:22:20

+0

我说你可以登录它一个数据库。日志块可以做到这一点。 – 2009-07-10 14:31:57

3

您可以序列化异常对象。事实上,在Web服务调用中抛出异常的情况下,需要将异常对象从服务器传输到客户端。这就是为什么System.Exception有一个constructor overload that creates an exception object from serialized data。对于串行/解串异常对象

代码示例:

private static void SerializeException(Exception ex, Stream stream) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 
    formatter.Serialize(stream, ex); 
} 

private static Exception DeserializeException(Stream stream) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 
    return (Exception)formatter.Deserialize(stream); 
} 

// demo code 
using (Stream memoryStream = new MemoryStream()) 
{ 
    try 
    { 
     throw new NullReferenceException(); 
    } 
    catch (Exception ex) 
    { 
     // serialize exception object to stream 
     SerializeException(ex, memoryStream); 
     memoryStream.Position = 0; 
    } 
    // create exception object from stream, and print details to the console 
    Console.WriteLine(DeserializeException(memoryStream).ToString()); 
} 

话虽这么说,我可能会满足于记录异常类型,消息和堆栈跟踪的地方,这样我可以检查的信息。

0

是的它的可能性,如果你的软件在远程站点,你可以在本地登录并定期通过web服务回到“母舰”。

这是一个非常有效的方式收集关于野外未处理的异常的信息并解决它们。

如果你收集堆栈跟踪它通常足够好,给你一个问题的提示。但是在发布版本中,您不会获得任何行号。

1

使用WCF,这将是一件容易的事。实施自定义IErrorHandler以将错误发送到日志记录服务。 WCF使用FaultException<TDetail>类以SOAP XML格式报告错误,并可将其直接发送到日志记录服务。

1

好吧,有很多方法可以解决这个问题。 在过去,我只是做了我会叫一个超级幼稚的XML序列化,这ammounted喜欢的东西

<exception> 
    <type></type> 
    <Message></Message> 
    <StackTrace></StackTrace> 
    <innerException></innerException> //this would have the same schema as the root exception 
</exception 

,并简单地传递。我不需要为我正在做的事情进行反序列化。当web服务失败时,我只是记录技术部分并向用户显示消息。

另一种方法是简单地对数据库表执行二进制序列化,将密钥传递到该表上,然后从数据库的二进制文件中重新提取异常。