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实体相关错误:远程终结点不再能识别此序列。这很可能是由于远程终结点上发生中止的主要内容,如果未能解决你的问题,请参考以下文章

具有 30mb 输入字符串的 WCF 服务 - 远程服务器返回错误:(413)请求实体太大

WCF 服务的多个 HTTPS 终结点

(413) 使用 WCF 请求实体太大错误

如何通过WCF SOAP服务访问EF导航属性?

传递大字节 [] 时 WCF 服务错误 413“实体太大”

Wcf 服务器和实体框架问题