【问题标题】:Fault detail not deserialized when specifying custom serializer指定自定义序列化程序时未反序列化故障详细信息
【发布时间】:2014-01-13 07:41:55
【问题描述】:

我在我的应用程序中使用了自定义 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&lt;TDetail&gt;,并且我无法访问故障的详细信息。

在做了一些调查后,我发现问题的根源在于,通过从 DataContractSerializerOperationBehavior 继承,.NET 在内部将 FaultFormatter 设置为 DataContractSerializerFaultFormatter,它不知道如何反序列化错误的详细信息(而不是XmlSerializerFaultFormatter)。问题绝对不在MySerializer 中,因为FaultException 在到达我的ReadObject 方法之前就被抛出了。

所以我的问题是如何让 WCF 正确反序列化我的故障详细信息? 我尝试自己寻找一种方法来设置 FaultFormatter,但没有运气,尤其是因为所有这些格式化程序都是内部的。

【问题讨论】:

    标签: c# .net wcf serialization fault


    【解决方案1】:

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

    为了用我自己的自定义序列化程序替换序列化程序,我所做的是将XmlSerializerOperationBehavior 替换为我自己的MyOperationBehavior(我在网上看到的任何地方都这样做)。我发现,如果我不替换行为,而是将我的新行为添加到行为列表中,那么错误将按预期反序列化。不过需要注意的一点是,MyOperationBehavior 应该放在行为列表中 XmlSerializerOperationBehavior 之前 - 否则将不会使用自定义序列化程序。

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

    正如我所说,将这两种行为放在一起听起来可能会导致我不知道的问题,因此,如果您知道此解决方案可能引发的任何冲突,我也很乐意就此提供意见。

    【讨论】:

      猜你喜欢
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多