正如问题所述,我正在竭尽全力寻找从一个WCF调用返回多个FaultException的最佳方法:

该方案如下:
客户A呼叫客户B
ClientB对ServerC进行了许多调用,其中一些调用可能返回FaultExceptions

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

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

我真正关心的唯一元素是“原因”,“代码”和“细节”。我的最后一招是手动编写代码以序列化“原因”和“代码”,但是我希望避免这种情况。

我还有其他方法可以做到吗?

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

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

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调用中返回列表中的多个?

最佳答案

好吧...我不完全了解该场景的第二部分。如果您的客户B的行为如下

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


要么

while(condition)
    ServerC.Call();


那么第一个异常将自动重新引发给客户端B,并且有可能重新引发给A,因此您无需处理多个异常。

但是,如果ClientB从不同的线程调用ServerC的几种方法,则您可能会遇到类似的情况。不过,如果ClientB这样从ServerC调用服务

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数组。

如果是这种情况,则您确实要收集多个异常并想报告所有异常

那么您可以创建一个自定义的FaultException类,该类继承自前者,并具有属性Exception[] InnerExceptions

但是,再次,我真的不相信您有这种“多个例外”。也许您的意思是嵌套异常,这些异常可以由InnerException常规属性正确处理。

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

关于c# - 从一个WCF调用返回多个FaultException的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4798311/

10-10 22:14