每次我的WCF主机应用程序池启动时,对其进行第一次WCF调用的客户端总是抛出“System.Xml.XmlException:有多个根元素”所有后续调用都能正常工作。
此异常发生在WCF请求的使用者/客户端。我已经为完整的WCF客户端和Silverlight客户端测试了这个。它使用basicHttpBinding,没有安全性,aspnetCompatabilityMode = true
如果应用程序池保持活动状态并不是什么大问题,但由于缺少活动,它会关闭,并且当它重新启动时会再次发生错误。
我还应该提到,应用程序池有时从非WCF请求开始到另一个页面。但仍然是第一次调用WCF时,它仍会在客户端抛出此异常。
有没有人见过这个?如有必要,我可以提供更多细节。
由于
答案 0 :(得分:3)
好的,在研究了这些选项之后,我想出了导致这个问题的原因。最终,继承并在交换的数据中同时具有serializable和DataContract属性并不会对反序列化进行反序列化。
问题的真正含义在于我的配置。之前我正在玩Streaming消息。我将主机transferMode设置为Streaming,我的客户端设置为Buffered。在silverlight中,这是我唯一的选择。因此,序列化问题的发生是因为消息被分块。在追踪几个电话后我注意到了这一点。
如此轻松的修复。将transferMode切换为Buffered。我将设置一个单独的端点用于流式传输并再次播放。我不需要流式传输CRUD服务。
感谢大家的投入。
-Nathan
答案 1 :(得分:0)
听起来像是序列化问题。我将研究如何构建DataContracts - 您使用的是DataContracts而不是XML序列化属性,对吧?
修改:根据我们的意见,我将为您的重构提出建议:
[DataContract]
public class ImageEffectExcludeParamRequest
{
[DataMember]
public string ImageID { get; set; }
[DataMember]
public int EffectID { get; set; }
[DataMember]
public ResponseInfo AdditionalInfo { get; set; }
}
[DataContract]
public class ResponseInfo
{
[DataMember]
public Enums.ServiceResponse.Status Status { get; set; }
[DataMember]
public string Message { get; set; }
}
使用组合而不是继承应该可以解决您的问题。