我正在构建这种elobrate Logging解决方案,用于政府环境,必须以某种方式完成。其中一个问题是我们将未经处理的异常冒充到global.asax中Application_Error的最后一点,其中的情况是,我们得到嵌套在异常对象中的所有异常并将该信息序列化到数据库。列表中有代码。没有一个例外。可能存在许多嵌套异常。我们构建了ASP.NET应用程序,我们拥有这个广泛的冒泡异常日志系统。发生异常。它会在另一个可能发生的地方冒泡,围绕另一个。它起泡到最后一点 - global.asax中的Application_Error,其中存在将机器信息写入数据库的所有逻辑。在此期间可能发生异常,其中包含其他异常
在我的情况下,仅涉及WCF,因为涉及的系统位于不同的区域中,并且WCF用于通信。并且您不能跨服务边界序列化/传递.NET异常对象,因此我定义了一个C#类/数据结构来表示异常:
[DataContract]
public class ExceptionStructure
{
[DataMember]
public string Message { get; set; }
[DataMember]
public string StackTrace { get; set; }
[DataMember]
public List<ExceptionStructure> InnerException { get; set; }
}
首先,哇,这个结构可能不起作用,因为InnerException是READ ONLY所以我也需要新类的帮助。我只需要Message和StackTrace字段以及InnerExceptions。
我需要帮助的是一个.NET异常对象,可能有也可能没有内部异常,有人可以帮我编写将填充其中一个ExceptionStructure类的代码吗?
另外,将其中一个反序列化为另一方的.NET异常列表的代码会很好吗?如果您看到更好的结构理念,请随意。
答案 0 :(得分:2)
您熟悉WCF faults吗?您可以使用它们来包装异常并通过WCF线路发送它们:
[ServiceContract]
public interface ICalculator
{
[OperationContract]
[FaultContract(typeof(DivideByZeroException))]
int Divide(int n1, int n2);
}
public Calculator : ICalculator
{
int Divide(int n1, int n2)
{
try
{
return n1/n2;
}
catch (DivideByZeroException ex)
{
throw new FaultException<DivideByZeroException>(ex);
}
}
}
编辑:在您的情况下,由于您正在讨论一组例外情况,因此您可以尝试使用AggregateException
进行故障排除答案 1 :(得分:0)
大多数(如果不是全部)异常都可以使用.NET运行时序列化(BinaryFormatter
,SoapFormatter
)进行序列化。为什么不将异常序列化为字节数组,使用WCF通过线路发送字节数组,然后反序列化为另一端的异常实例?
这将突出显示这样一个事实,即该机构选择依赖所有可以序列化的例外,但也许没关系。