简单的C#数据算法问题 - 从Exception类填充类

时间:2010-12-10 19:44:31

标签: c# wcf

我正在构建这种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异常列表的代码会很好吗?如果您看到更好的结构理念,请随意。

2 个答案:

答案 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运行时序列化(BinaryFormatterSoapFormatter)进行序列化。为什么不将异常序列化为字节数组,使用WCF通过线路发送字节数组,然后反序列化为另一端的异常实例?

这将突出显示这样一个事实,即该机构选择依赖所有可以序列化的例外,但也许没关系。