• WCF连接被意外关闭


    WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭

    在我们开发WCF项目的时候,常常会碰到一些莫名其妙的错误,有时候如果根据它的错误提示信息,一般很难定位到具体的问题所在,而由于WCF服务的特殊性,调试起来也不是那么方便,因此往往会花费不少时间来进行跟踪处理。本文介绍我在我在我的框架里面使用WCF服务的时候,出现的一个常见错误的处理方法,它的提示信息是:基础连接已经关闭: 连接被意外关闭。这种情况我碰到的有两种,一种是返回DataTable的时候出现的,一种是返回实体类类中带有枚举类型的情况,下面分别对它们的处理进行介绍。 

    1、DataTable返回值出现错误

    一般情况下,我们在设计WCF接口返回值的时候,都使用实体类或者实体类列表这种方式,但是有时候也可能需要返回一个DataTable的数据类型,如果按照下面的方式构造函数内容并返回,就可能出现错误。

    定义接口

    复制代码
            /// <summary>
            /// 根据查询条件,返回记录到DataTable集合中
            /// </summary>
            /// <param name="condition">查询条件</param>
            /// <param name="pagerInfo">分页条件</param>
            /// <returns></returns>
            [OperationContract]
            DataTable FindToDataTableWithPager(string condition, ref PagerInfo pagerInfo);
    复制代码

    实现函数,为了方便演示,填写了简单的测试代码。

    复制代码
            /// <summary>
            /// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
            /// </summary>
            /// <param name="condition">查询的条件</param>
            /// <param name="info">分页实体</param>
            /// <returns>指定对象的集合</returns>
            public DataTable  FindToDataTableWithPager(string condition, ref PagerInfo pagerInfo)
            {
                //测试代码
                DataTable dt = new DataTable();
                dt.Columns.Add("Test");
                for (int i = 0; i < 10; i++)
                {
                    dt.Rows.Add(new object[] { "Test" + i });
                }
                return dt;
            }
    复制代码

    测试的时候,会发现出现错误

    如果你按照它的提示,你可能搔破头皮也不知道具体是哪里的问题,这个地方其实很有意思,就是因为序列号DataTable的时候,没有TableName导致的,如果把函数体的实现里面,为返回的DataTable对象的TableName属性赋值一个值就可以了。

    复制代码
            /// <summary>
            /// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
            /// </summary>
            /// <param name="condition">查询的条件</param>
            /// <param name="info">分页实体</param>
            /// <returns>指定对象的集合</returns>
            public  DataTable  FindToDataTableWithPager(string condition, ref PagerInfo pagerInfo)
            {
                //测试代码
                DataTable dt = new DataTable();
                dt.Columns.Add("Test");
                for (int i = 0; i < 10; i++)
                {
                    dt.Rows.Add(new object[] { "Test" + i });
                }
                dt.TableName = "test";
                return dt;
            }
    复制代码

    测试之后,就发现能够顺利执行了。

     

    2、实体类中含有枚举类型导致的错误

     实体类定义,定义了一个枚举的对象ApplyStatus

    复制代码
        /// <summary>
        /// 流程申请单
        /// </summary>
        [DataContract]
        public class ApplyInfo : BaseEntity
        {  
            ........
    
    
            /// <summary>
            /// 当前状态(0:处理中,1:已完成,2:已退回,3:已撤消)(其它值为非法值)
            /// </summary>
            [DataMember]
            public virtual ApplyStatus Status
            {
                get
                {
                    return this.m_Status;
                }
                set
                {
                    this.m_Status = value;
                }
            }
        }
    复制代码

    枚举的定义一般情况如果设置如下代码:

    复制代码
        /// <summary>
        /// 表单当前处理状态。
        /// 当前状态(0:处理中,1:已完成,2:已退回,3:已撤消)(其它值为非法值)
        /// </summary>
        [DataContract]
        public enum ApplyStatus
        {
            /// <summary>
            /// 处理中 = 0
            /// </summary>
            处理中 = 0,
    
            /// <summary>
            /// 已完成 = 1
            /// </summary>
            已完成 = 1,
    
            /// <summary>
            /// 已退回 = 2
            /// </summary>
            已退回 = 2,
    
            /// <summary>
            /// 已撤消 =3
            /// </summary>
            已撤消 = 3
        }
    复制代码

    然后定义WCF服务接口和实现代码。

    WCF接口定义

    复制代码
            /// <summary>
            /// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
            /// </summary>
            /// <param name="condition">查询的条件</param>
            /// <param name="info">分页实体</param>
            /// <returns>指定对象的集合</returns>
            [OperationContract]
            List<T> FindWithPager(string condition, ref PagerInfo info);
    复制代码

    WCF服务接口实现

    复制代码
            /// <summary>
            /// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
            /// </summary>
            /// <param name="condition">查询的条件</param>
            /// <param name="info">分页实体</param>
            /// <returns>指定对象的集合</returns>
            public List<ApplyInfo> FindWithPager(string condition, ref PagerInfo info)
            {
                return bll.FindWithPager(condition, info);
            }
    复制代码

    那么通过WCF服务获取这个对象的信息时候,就会出现错误:基础连接已经关闭: 连接被意外关闭

     

     出现错误的原因,是因为枚举类型序列化出现了错误,需要在枚举的值里面增加[EnumMember]的声明,如下所示。

    复制代码
        [DataContract]
        public enum ApplyStatus
        {
            /// <summary>
            /// 处理中 = 0
            /// </summary>
            [EnumMember]
            处理中 = 0,
    
            /// <summary>
            /// 已完成 = 1
            /// </summary>
            [EnumMember]
            已完成 = 1,
    
            /// <summary>
            /// 已退回 = 2
            /// </summary>
            [EnumMember]
            已退回 = 2,
    
            /// <summary>
            /// 已撤消 =3
            /// </summary>
            [EnumMember]
            已撤消 = 3
        }
    复制代码

    再次编译运行并测试,最后的结果就是能够正常解析了。

    以上就是我们在开发WCF的时候,经常碰到的一些错误的解决方式,希望大家在开发WCF并进行调用的时候,碰到类似的问题,能够很好解决问题,节省宝贵的时间。

  • 相关阅读:
    解析SRT格式的电影字幕文件
    svn笔记
    一个REST风格的URI设计方案[Blog Web Services]
    微服务部署
    sleuth链路追踪
    springboot生成pdf
    绘制多个word表格,压缩文件夹并输出流
    数据库调优
    常用网站
    解决:pip Fatal error in launcher: Unable to create process using
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3828770.html
Copyright © 2020-2023  润新知