正如问题所说,我正在敲击从一个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调用返回列表中的多个?
答案 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<>。
中使用此类我在两篇博文中详细解释了它:
答案 3 :(得分:1)
对SOAP服务的请求可以返回响应或SOAP Fault。 FaultException<T>
类允许您返回SOAP Fault。
返回多个SOAP错误是没有意义的。一旦您对Service C的调用返回错误(FaultException),您应该停止工作并将您自己的错误返回给您的客户端。必须在操作的故障合同中定义此故障。