第一个WCF请求,客户端总是抛出System.Xml.XmlException:有多个根元素

时间:2009-07-16 14:40:55

标签: wcf basichttpbinding

每次我的WCF主机应用程序池启动时,对其进行第一次WCF调用的客户端总是抛出“System.Xml.XmlException:有多个根元素”所有后续调用都能正常工作。

此异常发生在WCF请求的使用者/客户端。我已经为完整的WCF客户端和Silverlight客户端测试了这个。它使用basicHttpBinding,没有安全性,aspnetCompatabilityMode = true

如果应用程序池保持活动状态并不是什么大问题,但由于缺少活动,它会关闭,并且当它重新启动时会再次发生错误。

我还应该提到,应用程序池有时从非WCF请求开始到另一个页面。但仍然是第一次调用WCF时,它仍会在客户端抛出此异常。

有没有人见过这个?如有必要,我可以提供更多细节。

由于

2 个答案:

答案 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; } 
}

使用组合而不是继承应该可以解决您的问题。