【问题标题】:What is the best way to return multiple FaultExceptions from one WCF call?从一个 WCF 调用返回多个 FaultExceptions 的最佳方法是什么?
【发布时间】:2011-01-25 20:11:59
【问题描述】:

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

场景如下:
ClientA 调用 ClientB
ClientB 多次调用 ServerC,其中一些可能返回 FaultExceptions

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

我尝试使用 XmlSerializer、DataContractSerializer 和 NetDataContractSerializer 对 FaultExceptions 和 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 调用的列表中返回多个?

【问题讨论】:

  • 为什么不直接附加 FaultException 的信息呢?不用序列化,只需要在ClientB处捕获,在传递回ClientA的故障信息中加入故障即可?

标签: c# .net wcf serialization


【解决方案1】:

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

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

while(condition)
    ServerC.Call();

然后 first 异常会自动重新抛出给客户端 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
}

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

为了有一致的异常

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

如果您确实收集了多个异常并希望全部报告它们的情况

然后您可以创建一个自定义 FaultException 类,继承自前者,并带有属性 Exception[] InnerExceptions

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

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

【讨论】:

    【解决方案2】:

    只需为每个 wcf 合约添加一个故障合约,并在客户端 B 中追溯异常,请参阅:http://msdn.microsoft.com/en-us/library/ms733721.aspx

    【讨论】:

      【解决方案3】:

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

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

      Part 1 Part 2

      【讨论】:

      • 感谢您的回复。这是最接近我想做的事情。问题是我还没有弄清楚如何创建异常列表,以便将它们从服务器序列化到客户端。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-07
        • 2010-09-11
        • 1970-01-01
        • 1970-01-01
        • 2020-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多