【问题标题】:Custom Exception as Detail in Fault Exception自定义异常作为故障异常中的详细信息
【发布时间】:2011-01-09 14:34:36
【问题描述】:

我正在尝试将我自己的自定义异常从我的 WCF 服务抛出到 FaultException 中,并在我的 WCF 客户端中捕获它。但是,在客户端,异常被捕获为非泛型 FaultException,并且我的自定义异常的详细信息丢失了。

我的自定义例外是:

[Serializable] public class MyCustomException : ApplicationException 
{ ... }

我是这样扔的:

throw new FaultException<MyCustomException>(new MyCustomException("foo bar!"));

(请注意,我确实在接口中的方法上放置了 [FaultContract(typeof(MyCustomException))])

这是我尝试在我的客户端中捕获它的方法:

...
catch (FaultException<MyCustomException> mcex)
{
    Console.WriteLine(mcex); 
}
 catch (FaultException fex) 
{
    Console.WriteLine(fex); 
}

我的目标是在上面的第一个 catch 子句中捕获异常,但它最终会在第二个 catch 子句中捕获。

奇怪的是,如果我将 MyCustomException 替换为 ApplicationException,那么 FaultException 确实会被正确捕获。

我猜问题是 MyCustomException 被序列化为 Serializable(而不是通过 DataContractSerializer),并且可能我缺少一些对 WCF 的附加指令。 ServiceKnownType 属性行中的内容? (虽然我试过了,但无济于事)。

【问题讨论】:

    标签: .net wcf exception-handling faultexception


    【解决方案1】:

    是的,除非您在服务合同中将该类型指定为故障合同,否则您将无法捕获通用 FaultException:

    [ServiceContract]
    interface IYourService
    {
       [OperationContract]
       [FaultContract(typeof(MyCustomException))]
       SomeReturnValue YourMethodCall(SomeInputValue input);
    }
    

    只有执行此操作后,然后您才能在客户端代码中捕获并处理特定的、通用类型的 FaultException。

    请参阅MSDN docs on FaultException&lt;T&gt; 这个blog post 了解更多有关 WCF 错误处理的背景和有用信息。

    另外,我个人总是会用 [DataContract] 属性(以及我想用 [DataMember] 序列化的所有成员)来装饰我的故障合同类:

    [Serializable] 
    [DataContract]
    public class MyCustomException : ApplicationException 
    { ... }
    

    【讨论】:

    • 感谢您的帮助,但正如我最初提到的,我已经在 ServiceContract 中的 throwing 方法上正确设置了 FaultContract 属性,但这并没有解决问题。此外,AFAIK 不可能用 [DataContract] 装饰 .net 中的异常,因为异常总是实现 ISerializable 并且这两种序列化机制发生冲突。至少当我今天尝试这个时,我最终得到了一个非常明确的错误指示。更多信息在这里:tinyurl.com/yd634sa 和这里:tinyurl.com/y8jgf42 :)
    • 是的,通常情况下,由于 SOAP 错误是为与非 .NET 客户端的互操作性而设计的,因此您不会只使用标准 .NET 异常作为您的详细信息,而是使用自定义类来装饰 [DataContract ] 和 [DataMember]
    猜你喜欢
    • 1970-01-01
    • 2011-03-20
    • 2023-03-21
    • 2010-09-27
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多