WCF的自定义异常

WCF的自定义异常,wcf,exception-handling,custom-exceptions,faultexception,Wcf,Exception Handling,Custom Exceptions,Faultexception,嘿,我正在使用Oleg Sych的解决方案通过WCF处理异常: 对于已知的异常(如InvalidOperationException和SystemException),一切都可以正常工作,但当我尝试使用自己的自定义异常时,它不起作用,我得到以下wcf异常: 读取管道时出错:管道已结束。(109,0x6d) 这是我的自定义例外: [KnownType(typeof(SessionExpiredException))] [global::System.Serializable] [DataCont

嘿,我正在使用Oleg Sych的解决方案通过WCF处理异常:

对于已知的异常(如InvalidOperationException和SystemException),一切都可以正常工作,但当我尝试使用自己的自定义异常时,它不起作用,我得到以下wcf异常: 读取管道时出错:管道已结束。(109,0x6d)

这是我的自定义例外:

[KnownType(typeof(SessionExpiredException))]
[global::System.Serializable]
[DataContract]
public class SessionExpiredException : Exception
{
    public SessionExpiredException() { }
    public SessionExpiredException(string message) : base(message) { }
    public SessionExpiredException(string message, Exception inner) : base(message, inner) { }
    protected SessionExpiredException(
      System.Runtime.Serialization.SerializationInfo info,
      System.Runtime.Serialization.StreamingContext context)
        : base(info, context) { }
}

我做错了什么?我是否缺少一个属性?

您不需要将自定义错误建模为异常,而是将其作为与DataMembers的DataContract,以获取您想要返回的信息。然后,在WCF服务上,只返回您类型的FaultException

本页提供了一个关于如何建模的好示例:


上述解决方案是错误的。

另一方面,使用
FaultException
可以让您两全其美。
public SessionExpiredException() { }
    public SessionExpiredException(string message) : base(message) { }
    public SessionExpiredException(string message, Exception inner) : base(message, inner) { }
    protected SessionExpiredException(
      System.Runtime.Serialization.SerializationInfo info,
      System.Runtime.Serialization.StreamingContext context)
        : base(info, context) { }