WCF实体相关错误:远程终结点不再能识别此序列。这很可能是由于远程终结点上发生中止
Posted Nemo_XP
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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实体相关错误:远程终结点不再能识别此序列。这很可能是由于远程终结点上发生中止的主要内容,如果未能解决你的问题,请参考以下文章