我试图在我的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子句中捕获 .
奇怪的是,如果我用ApplicationException替换MyCustomException,那么确实正确捕获了FaultException .
我猜测问题是MyCustomException序列化为Serializable(而不是通过DataContractSerializer),也许我错过了一些WCF的附加指令 . ServiceKnownType属性中的某些内容? (虽然我尝试过,但无济于事) .
1 回答
是的,在您将该类型指定为服务 Contract 中的错误 Contract 之前,您将无法捕获通用FaultException:
只有在执行此操作后,您才能在客户端代码中捕获并处理特定的,通常类型的FaultException .
有关WCF错误处理的更多背景信息和良好信息,请参阅MSDN docs on FaultException<T> this blog post .
另外,我个人总是用[DataContract]属性(以及我希望用[DataMember]序列化的所有成员)装饰我的错误 Contract 类: