【发布时间】:2017-04-24 09:28:24
【问题描述】:
众所周知,异常通常是不可序列化的,并且在对不同的 .NET 异常进行序列化/反序列化时在各种序列化程序中发现了一些非常奇怪的错误后,我想出了用于传输级别的简单 DTO:
[DataContract]
public class Error
{
[DataMember]
public string Message {get;set;}
[DataMember]
public string StackTrace {get;set;}
//all Exception fields here
}
我可以成功地将 Exception 转换为 Error 类,但是如何做相反的事情呢?我的意思是,我想在实际运输之后将它扔掉,并带有有效的远程堆栈跟踪以及运输前的一切...... 一种方法是使用反射,但是,呃,它很糟糕而且看起来不健康。
【问题讨论】:
-
为什么?异常已经包含调用栈并且可以被序列化。对
ToString()的简单调用将返回消息和 堆栈跟踪。您提出的首先是异常的样子。 -
嗯,很简单。它不是结构化的。因此很难在用户界面中将其分离,或者将其通过管道传输到 graylog 或某些日志聚合器中,您可以在其中构建日志以更好地理解错误。
-
这将是一个严重的错误,因为 SOAP 已经有自己的故障协议。违反它,您的客户将无法沟通。此外,您不想将内部信息暴露给不受信任的客户端。这就是为什么将异常映射到不同的故障消息的标准做法
-
您正在尝试做的事情已经不健康,因此使用反射不会受到伤害,就像在这个问题中一样:stackoverflow.com/q/37093261/5311735
-
如果您不想反射 - 您可以使用默认的 .Net 序列化程序(二进制格式化程序)将异常序列化为字节数组,然后像这样传递它(作为 byte[] 属性)。然后你应该能够在客户端很好地反序列化它。是的,这也很丑陋,但是您再次尝试做的事情已经有争议了。
标签: c#