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

时间:2013-12-25 09:58:44

标签: c# .net wcf serialization fault

我在我的应用程序中使用自定义XmlObjectSerializer。为此,我将XmlSerializerOperationBehavior替换为MyOperationBehavior,如下所示:

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

    public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
    {
        return new MySerializer();
    }
}

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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