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并进行调用的时候,碰到类似的问题,能够很好解决问题,节省宝贵的时间。

时间: 2024-10-04 13:03:02

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

SQLSERVER 备份还原常见错误以及解决方法

SQLSERVER 备份还原常见错误以及解决方法      个人在做测试的时候发现的常见问题,和一些解决方案,记录下来,以免遗忘! 错误一 解决方法: 先分离源数据库,然后你可以使用 move 属性 或者直接添加 REPLACE

SQLServer 报错:用户、组或角色&#39;XXX&#39; 在当前数据库中已存在. 错误:15023解决方法

背景: 最近在迁移SQLServer数据库2008时,新建用户后,做用户映射时. SQLServer 报错:用户.组或角色'XXX' 在当前数据库中已存在. 错误:15023. 下面讲一下解决的方法. 分析:    将数据库恢复到其他服务器时,数据库中包含一组用户和权限,但可能没有相应的登录或者登录所关联的用户可能不是相同的用户.    这种情况被称为存在"孤立用户".此时是不能通过新建登录或者是对同名登录授予对应数据库的"用户"权限来解决登录问题,    因为SQ

Win系统下用Eclipse中运行远程hadoop MapReduce程序常见错误及解决方法

一.Permission denied 1.Win系统下用Eclipse中运行远程hadoop MapReduce程序出现报错 org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=xxx, access=WRITE, inode="xxx":xxx:supergroup:rwxr-xr-x

Eclipse之NDK编译——常见错误的解决方法记录

在工程目录下的jni文件夹下编写的c/c++代码在编译时,通常会遇到如下的几种类型错误: 1.Unresolved inclusion:<XXX> 2.syntax error 3.Function 'XXX' could not be resolved 4.Type 'XXX' could not be resolved 5.Symbol 'XXX' could not be resolved 6.Method 'XXX' could not be resolved 7.Invalid ar

telnet常见错误及其解决方法

telnet常见错误提示及解决方法 当出现以下问题时,即软件已安装.服务已经启动,查看23号端口却发现,没有此端口,解决方法如下:修改telnet服务配置文件. [[email protected] ~]# rpm -qa telnet* telnet-server-0.17-48.el6.x86_64 telnet-0.17-48.el6.x86_64 [[email protected] ~]# service xinetd start 正在启动 xinetd: [[email protec

web程序常见错误及解决方法

404错误产生原因及解决方法 在刚开始进行Web应用开发的时候,经常看见页面出现404这个数字,我们一般会称之为运行产生了404错误.类似于404这个数字,还有可能在页面上看到405.500这两个数字,他们都是服务器执行完客户端的请求以后,返回给客户端的一个关于执行结果的状态编码说明. 如果在运行结果页面中没有看到期待的页面,却看到了404.405.500这样的数字,那么代表着服务器告诉客户端运行产生了错误,掌握何种错误情况产生对应的数字将有利于问题的解决. 404产生的原因为Web服务器(容器

Directx11编程中遇到的错误/异常/解决方法

xnamath.h 报错: 在标识符“XMConvertToRadians”的前面 如下报错 1>d:\program files\microsoft directx sdk (june 2010)\include\xnamath.h(159): error C2146: 语法错误: 缺少“;”(在标识符“XMConvertToRadians”的前面) 1>d:\program files\microsoft directx sdk (june 2010)\include\xnamath.h(

directx11编程中遇到的错误及解决方法

(2016-05-10)xnamath.h 报错: 在标识符"XMConvertToRadians"的前面 报错如下: 1>d:\program files\microsoft directx sdk (june 2010)\include\xnamath.h(159): error C2146: 语法错误: 缺少";"(在标识符"XMConvertToRadians"的前面) 1>d:\program files\microsoft

mysql中出现的错误及解决方法

一.mysql错误:ERROR 29 (HY000): File '/var/www/xiaoyou/static/upload/import/20130427105733.csv.txt' not found (Errcode: 13) -导入txt文件时出现的错误(LOAD DATA INFILE 'bj' INTO TABLE bjpi fields TERMINATED by ',' LINES TERMINATED BY '\n';) 解决方法: 1.如果不是root用户的话,先查看文