我在我的应用程序中使用自定义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的方法,但没有运气,特别是因为所有这些格式化程序都是内部的。
答案 0 :(得分:0)
我找到了一种方法来使FaultExceptions正确地反序列化。虽然它非常hackish,我觉得使用它有点不舒服,但我想我会分享以防其他人想要解决这个问题。如果有更好的答案,我会很高兴听到。
为了用我自己的自定义序列化程序替换序列化程序,我所做的就是将XmlSerializerOperationBehavior
替换为我自己的MyOperationBehavior
(我在网上看到的所有方式)。我发现,如果不是替换行为而是将新行为添加到行为列表中,则会按预期反序列化故障。需要注意的一点是MyOperationBehavior
应放在XmlSerializerOperationBehavior
之前的行为列表中 - 否则将不会使用自定义序列化程序。
description.Behaviors.Insert(0, new MyOperationBehavior());
正如我所说,将这两种行为放在一起听起来可能会导致我不知道的问题,所以如果您知道此解决方案可能引发的任何冲突,我也很乐意收到相关信息。