本文主要是介绍WCF实体相关错误:远程终结点不再能识别此序列。这很可能是由于远程终结点上发生中止,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
项目中,服务端获取数据填充List后,通过WCF传递到Business的Proxy.cs时报错如下:
System.ServiceModel.CommunicationException:“远程终结点不再能识别此序列。这很可能是由于远程终结点上发生中止。WSRM:Identifier 的值不是已知的序列标识符。 可靠会话出错。”
经查代码,发现服务端代码并无问题。而问题出现在实体类中。
[Serializable]
[DataContract]
public class PatientInfo
{[DataField("SEX")][DataMember]public EnumSex Sex { get; set; }/// <summary>/// 性别代码/// </summary>[DataMember]public int SexCode { get { return Sex.GetHashCode(); } }
}
以上代码,发现如果修改为
/// <summary>/// 性别代码/// </summary>[Display(Name = "SexCode", Description = "性别代码")][DataMember]public int SexCode { get { return 1; } }
依然会报此错误。因此推测使用WCF在服务端和客户端传递属性时候,使用 [DataMember] 标记的数据契约必须声明 Set 方法,未声明 Set 方法将抛出异常。
如下加上set即可
[DataMember]
public int SexCode { get { return Sex.GetHashCode(); }set{} }
当然如果发现我们实际也不需要传递这个属性的时候,那就直接把[DataMember]标记去掉就不会报错了。如下
public int SexCode { get { return Sex.GetHashCode(); } }
关于Enum枚举类型,如果操作不当也会出现类似问题,如下
原因,经查代码得知,没有给0默认值,这样一般常会出现未赋值的情况,则必定报错。
处理方式:
1.加上标记:默认值不序列化 [DataMember(EmitDefaultValue=false)](不建议)
// 当属性值为默认值时,不会参与序列化。
[DataMember(EmitDefaultValue=false)]
public EnumSex Sex { get; set; }
2.枚举必须给默认值0(强烈建议)
wcf相关文章:
知识宝典之介绍WCF数据契约
WCF三大契约使用说明
只读字段的WCF DataMember属性?
这篇关于WCF实体相关错误:远程终结点不再能识别此序列。这很可能是由于远程终结点上发生中止的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!