gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:02:17 25 4
gpt4 key购买 nike

我正在使用自定义 XmlObjectSerializer在我的申请中。为此,我替换了 XmlSerializerOperationBehaviorMyOperationBehavior看起来像这样:

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,但没有成功,尤其是因为所有这些格式化程序都是内部的。

最佳答案

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

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

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

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

关于c# - 指定自定义序列化程序时未反序列化故障详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20771472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com