我已经通过 slsvcutil.exe 为我的 WCF RIA 服务类生成了一个代理客户端,如 Xamarin“Web 服务简介”文档中所述,但是当我尝试调用其中一种异步方法时,我的“完成”事件处理程序永远不会被调用——几分钟后,应用程序只是从 Android 模拟器中终止(它在 Monotouch 中也做同样的事情)。
经过几天的故障排除,我终于找到了崩溃的根源,但不知道如何修复它。我怀疑这是某个地方的 Mono 中的错误,但不知道如何进一步排除故障。
我生成的代理有一个这样定义的类:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name = "ChangeSetEntry", Namespace = "DomainServices")]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(SL5Proxy.ChangeSetEntry[]))]
public partial class ChangeSetEntry : object
{
...
}
(上面的代码被大大简化了——大约有十几KnownTypeAttribute()
行,但我已经确定上面显示的那一行是问题的根源。重要的是要注意该ChangeSetEntry
对象没有对ChangeSetEntry[]
数组的任何引用。)
我发现如果我简单地注释掉
[System.Runtime.Serialization.KnownTypeAttribute(typeof(SL5Proxy.ChangeSetEntry[]))]
从代理代码行,一切工作 100% 正确,我的异步“完成”处理程序完全按预期调用。我不知道为什么 slsvcutil.exe 会生成有问题的 KnownTypeAttribute() 行,但确实如此。
ChangeSetEntry
我的猜测是,当类告诉运行时序列化程序是已知类型时,会创建某种无限递归ChangeSetEntry[]
——运行时尝试解析已知类型,然后返回ChangeSetEntry
并再次执行所有操作。
所以我很好奇是否有其他人看到过这个问题,这是否是一个已知问题以及是否有解决方法——也许是某种方式来抑制KnownTypeAttribute()
从 slsvcutil.exe 生成行