从一个WCF调用返回多个FaultExceptions的最佳方法是什么?

时间:2011-01-25 20:12:00

标签: c# .net wcf serialization

正如问题所说,我正在敲击从一个WCF调用返回多个FaultExceptions的最佳方法:

方案如下:
ClientA致电ClientB
ClientB对ServerC进行了多次调用,其中一些调用可能会返回FaultExceptions

我想将所有的FaultExceptions返回给ClientA,我没有遇到任何好办法。

我尝试使用XmlSerializer,DataContractSerializer和NetDataContractSerializer对FaultExceptions和MessageFault对象进行序列化和反序列化无济于事。

我真正关心的唯一元素是Reason,Code和Detail。我的最后一招是手动编写代码来序列化Reason和Code,但我希望避免这种情况。

还有其他方法可以解决这个问题吗?

编辑:从我得到的回答来看,我认为我的问题不是很清楚

在伪代码中,我尝试执行以下操作:

class ClientA()
{
    Main()
    {
        ClientB.OperateOnManyValues(array[] values)
    }
} 

ClientB()
{
     OperateOnManyValues(array[] values)
     {
         foreach(Val val in values)
         {
             try
             {
                  ServerC.OperateOnOneValue(val)
             }
             catch(FaultException ex)
             {
                 errorList.Add(ex)
             }
         }  
     return errorList
     }
}

编辑2:

首先,我要感谢大家试图回答这个问题。我觉得有些答案可以解答不同的问题 一张海报建议我一收到错误就抛出异常。不幸的是,现在该系统是如何工作的。操作的每个值完全独立于其他值,不受其他值的成功或错误的影响。我不希望一个错误影响其他值的处理 另一张海报建议返回某种数据结构,其中包含所有故障的所有FaultException数据。这就是我想要做的,但问题是返回FaultExceptions列表会引发序列化错误。有没有办法序列化FaultException所以我可以从WCF调用返回列表中的多个?

4 个答案:

答案 0 :(得分:2)

嗯......我不完全理解场景的第二部分。如果您的客户B的行为如下

ServerC.A();
[...]
ServerC.B();
[...]
ServerC.C();

while(condition)
    ServerC.Call();

然后第一个异常会自动重新抛出到客户端B并可能重新抛出到A,因此您没有多个异常需要处理。

但是如果ClientB从不同的线程调用ServerC的几个方法,那么你可能会有类似的东西。但是,如果ClientB像这样从服务器C调用服务

try
{
    ServerC.A();
} catch(Exception ex)
{
    //store exception for A
}
    [...]
try{
    ServerC.B();
} catch(Exception ex)
{
    //store exception for B
}
    [...]
try
{
    ServerC.C();
} catch(Exception ex)
{
    //store exception for C
}

你必须以自己的方式处理它。

为了获得一致的异常

报告有关根本原因的信息,您必须使用InnerException类的FaultException属性,但不能保存InnerExceptions数组。

如果您的情况是收集多个例外并且想要全部报告

然后你可以使用属性Exception[] InnerExceptions创建一个自定义的FaultException类,继承自前者。

但是,我再也不相信你有这种“多重例外”。也许你的意思是嵌套异常,它们由InnerException常规属性正确处理。

如果您可以向我们展示一些伪代码,那将会有所帮助。

答案 1 :(得分:2)

只需在每个wcf合约中添加一个错误合同,然后在客户B中重新启动异常,请参阅:http://msdn.microsoft.com/en-us/library/ms733721.aspx

答案 2 :(得分:2)

我会创建一个简单的DataContract类,其中包含异常列表作为属性。 然后在类型化的FaultException<>。

中使用此类

我在两篇博文中详细解释了它:

Part 1 Part 2

答案 3 :(得分:1)

对SOAP服务的请求可以返回响应或SOAP Fault。 FaultException<T>类允许您返回SOAP Fault。

返回多个SOAP错误是没有意义的。一旦您对Service C的调用返回错误(FaultException),您应该停止工作并将您自己的错误返回给您的客户端。必须在操​​作的故障合同中定义此故障。