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-09-17 04:32:48

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

Oracle数据库TNS常见错误的解决方法汇总_oracle

TNS是Oracle Net的一部分,是专门用来管理和配置Oracle数据库和客户端连接的一个工具,在大多数情况下客户端和数据库要通讯,就必须配置TNS.本文主要讲述了Oracle数据库TNS常见错误的解决方法如下: 1.ORA-12541:TNS:没有监听器 原因:没有启动监听器或者监听器损坏.若是前者,使用命令net start OracleOraHome10gTNSListener(名字可能有出入)即可;如果是后者,则使用"Net Configuration Assistant"

asp.net操作过程中常见错误的解决方法_实用技巧

错误一:IIS无法识别ASP.NET,并报出以下错误: 名称以无效字符开头.处理资源 'http://localhost/likong/' 时出错.第 1 行,位置: 2 解决方法: 在命令窗口中运行: C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe -i [.NET 1.1] C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i [.NE

Android开发中的9个常见错误和解决方法_Android

经过各种各样的整理,以及和热心网友讨论,终于整理出了九种android开发中最常见的问题和解决方案再次跟大家分享下!!有用的话请顶顶帖子,共同进步.好了不多说了,下面是详解! 1. 如果你的项目的R文件不见的话,可以试下改版本号在保存,R文件不见一般都是布局文本出错导致. 2. 布局文件不可以有大写字母 3. 抛出如下错误WARNING: Application does not specify an API level requirement!, 是由于没有指定users sdk的缘故,修改A

Android开发中的9个常见错误和解决方法

经过各种各样的整理,以及和热心网友讨论,终于整理出了九种android开发中最常见的问题和解决方案再次跟大家分享下!!有用的话请顶顶帖子,共同进步.好了不多说了,下面是详解! 1. 如果你的项目的R文件不见的话,可以试下改版本号在保存,R文件不见一般都是布局文本出错导致. 2. 布局文件不可以有大写字母 3. 抛出如下错误WARNING: Application does not specify an API level requirement!, 是由于没有指定users sdk的缘故,修改A

常见的ASP.NET中编译执行错误及解决方法

21.vs2005不能从源文件模式切换到视图模式 解决方法:dos下运行下 devenv /resetskippkgs (win+r cmd) 22.Validation of viewstate MAC failed 解决办法:页面的顶部page加 EnableViewState="False" EnableViewStateMac = "False" 来解决这个问题 23.Automation server can't create object"(A

Windows Server 2003 启动中常见错误的解决方法_win服务器

摘要:在Windows Server 2003启动过程中,会出现各种各样的问题,本文介绍了操作系统启动过程的几个阶段,收集了一些经常出现的错误,并结合 Windows 操作系统启动过程,针对这些错误提出了解决方法. 当诊断一个系统启动错误时,判断系统是在哪一阶段出现错误非常关键,系统启动过程根据 CPU 架构不同略微有些差异,下面我们简单介绍一下 x86-based 系统启动过程的几个阶段: 1. Pre-Boot Sequence 2. Boot Sequence 3. Kernel Load

WordPress博客程序常见错误的解决方法

  WordPress是主流的 Blog 搭建平台. WordPress 可以说是世界上目前最先进的 weblog 程序.目前开发的程序大多都是根据它仿造的.它更能把握搜索引擎,在你使用 WordPress 并掌握几种插件后,对于优化将不用过多的操心,它会为你想的更多. 主题"> 如果你是一个喜欢随手编上一段代码的WordPress 用户,又或者你是一个喜欢安装插件,改变主题的用户,你就会明白,错误是没有办法避免的.你也会明白当你卷入一个无法预计的错误,而又没有找到解决办法的时候是有多么的

VPN连接常见错误的解决方法

问题描述 错误619解决办法详解:私设IP或路由器不支持ppTppassthrough,或是此IP地址是私设IP.这种情况大数多原因为客户机连接Internet的网关(如家庭宽带路由或公司上网网关路由或防火墙)NAT-T功能关闭或对VPN支持性不好,主要是对GRE及PPTP协议的NAT-T不支持.可打开网关路由的NAT-T功能,如果还是出现错误,则需要更换网关设备,现在市面上大多数设备已经支持.解决办法:更换路由器或使用L2TP协议的VPN连接,需要打L2TPVPN补丁!(点击这里下载)VPN错

android 项目中出现红色感叹号的解决方法

[问题原因]:工程中classpath中指向的包路径错误 [解决办法]:右键项目名称 BuildPath ---> Configure Build Paht...中,然后上面有几个选项卡找到 Libraries中出现红色叉号的包为路径错误的包.到classpath中修改相应包的当前路径.然后回到eclipse中F5刷新工程.   下面两段为我解决此问题时在网上找的参考资料,可参阅: 你用myeclipse新建 web工程,在工程目录下会生成一个 .classpath 配置文件, 里面是你工程里面