我已经通过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()
行,但我已经确定上面显示的那一行是问题的根源。重要的是要注意{{1} } object没有对ChangeSetEntry
数组的任何引用。)
我发现如果我只是注释掉
ChangeSetEntry[]
来自代理代码的行,一切正常100%正确,我的异步“完成”处理程序完全按预期调用。我不知道为什么slsvcutil.exe生成有问题的KnownTypeAttribute()行,但确实如此。
我的猜测是,当[System.Runtime.Serialization.KnownTypeAttribute(typeof(SL5Proxy.ChangeSetEntry[]))]
类告诉运行时序列化程序ChangeSetEntry
是已知类型时,会创建某种无限递归 - 运行时尝试解析已知类型,来回到ChangeSetEntry[]
然后再做一遍。
所以我很好奇是否有其他人看过这个问题,是否已知问题以及是否有解决方法 - 或许某种方法来抑制slsvcutil.exe生成ChangeSetEntry
行