我今天开始在 WCF 反序列化中遇到错误 - 代码一直没有改变并且工作了几个月。
问题是我得到运行时XmlException
说'名称不能以'<'字符'开头。我已经调试到 .NET 源代码,似乎错误在于反序列化来自 WCF 服务调用的返回对象。这些对象是使用自动属性定义的,似乎支持字段的名称类似于<MyProperty>k_BackingField
,这就是 XmlException 的来源。
我在网上看到了其他一些参考资料,人们接受的解决方案是“我将代码更改为不使用自动属性”,这对我来说真的不能接受,因为我要更改 100 个对象(有 1000 个其中的属性)。此外,当我上周运行它时,同样的代码运行良好,并且似乎不会影响所有序列化的 DTO,只会影响一些。
更令人沮丧的是,它似乎有点断断续续。有时今天早上,没有抛出异常......!
问题;
- 为什么在未更改的代码和未更改的框架源中突然出现此问题?
- 如何在不修改所有 DTO 以使用完全实现的属性的情况下解决此问题?
更新:经过一天左右的正常工作后,这个问题再次出现 - 我没有理由找到它为什么会工作/不工作/再次工作,但我们到了。
我已经进一步追踪问题与我在 ServiceContracts 上使用ServiceKnownType
属性的一些代码相关,该属性用于定义序列化的已知类型。似乎虽然报告错误的类型甚至不是我当时正在进行的服务调用的一部分,但此错误发生在作为此已知类型“发布”行为的一部分的类型上。
当我使用一些代理创建代码来应用一些服务行为时,就会出现问题;
IOperationBehavior innerBehavior = new PreserveReferencesOperationBehavior(
description, this.preserveReferences, this.maxItemsInObjectGraph);
innerBehavior.ApplyClientBehavior(description, proxy);
我无法调试ApplyClientBehavior
代码,因为它是System.ServiceModel
(或者我可以吗?)的一部分,但该方法中的某些内容试图验证我使用我的ServiceKnownType
属性发布的所有类型,并使用 this 打破其中一些XmlException
。我不知道为什么某些类型会失败 - 并且仅针对它们的某些属性。
这是针对它们报告错误的类型的示例;
[Serializable]
public class MyDataObject
{
public ActivitySession(string id)
{
this.Id = id;
this.IsOpen = true;
}
public string Id { get; set; }
public bool IsValid { get; set; }
}
异常报告了一个错误Id
-><Id>k_BackingField cannot start with '<'
因此,在该类中没有任何争议,也无需考虑继承。它甚至不是服务合同的一部分,只是它以前作为序列化的已知类型发布。
现在这变得非常深奥,所以我不期待答案,而只是更新问题所在。