指定自定义序列化程序时,未反序列化故障详细信息

我在我的应用程序中使用自定义XmlObjectSerializer 。 为此,我用MyOperationBehavior替换XmlSerializerOperationBehavior ,它看起来像这样:

 public class MyOperationBehavior : DataContractSerializerOperationBehavior { public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList knownTypes) { return new MySerializer(); } public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList knownTypes) { return new MySerializer(); } } 

问题在于,通过这样做,任何故障都被反序列化为非genericsFaultException而不是FaultException并且我无法访问故障的详细信息。

在做了一些调查之后,我发现问题的根源在于,通过inheritanceDataContractSerializerOperationBehavior ,.NET在内部将FaultFormatter设置为DataContractSerializerFaultFormatter ,它不知道如何反序列化故障的细节(而不是XmlSerializerFaultFormatter )。 问题肯定不在MySerializer ,因为在它到达我的ReadObject方法之前抛出了FaultException

所以我的问题是我该怎么做才能使WCF正确反序列化我的错误细节? 我试着找一种自己设置FaultFormatter的方法,但没有运气,特别是因为所有这些格式化程序都是内部的。

我找到了一种方法来使FaultExceptions正确地反序列化。 虽然它非常hackish,我觉得使用它有点不舒服,但我想我会分享以防其他人想要解决这个问题。 如果有更好的答案,我会很高兴听到。

为了用我自己的自定义序列化程序替换序列化程序,我所做的是将XmlSerializerOperationBehavior替换为我自己的MyOperationBehavior (我在Web上看到的所有方式)。 我发现,如果不是替换行为,我只是将我的新行为添加到行为列表中,故障将按预期反序列化。 有一点需要注意的是, MyOperationBehavior应该放在XmlSerializerOperationBehavior之前的行为列表中 – 否则将不会使用自定义序列化程序。

 description.Behaviors.Insert(0, new MyOperationBehavior()); 

正如我所说,将这两种行为放在一起听起来可能会导致我不知道的问题,所以如果您知道此解决方案可能引发的任何冲突,我也很乐意获得相关信息。