在我们开发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 = ; i < ; 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 = ; i < ; 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>
处理中 = , /// <summary>
/// 已完成 = 1
/// </summary>
已完成 = , /// <summary>
/// 已退回 = 2
/// </summary>
已退回 = , /// <summary>
/// 已撤消 =3
/// </summary>
已撤消 =
}

然后定义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]
处理中 = , /// <summary>
/// 已完成 = 1
/// </summary>
[EnumMember]
已完成 = , /// <summary>
/// 已退回 = 2
/// </summary>
[EnumMember]
已退回 = , /// <summary>
/// 已撤消 =3
/// </summary>
[EnumMember]
已撤消 =
}

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

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

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

  1. Servlet常见错误及解决方法

    常见错误及解决方法 1. 404产生的原因为Web服务器(容器)根据请求地址找不到对应资源,以下情况都会出现404的错误提示: 输入的地址有误(应用名大小写不正确,名称拼写不正确) 在web.xml文 ...

  2. IIS7常见错误及解决方法

    IIS7常见错误及解决方法   问题一:HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效.  详细错误信息模块 IIS We ...

  3. 微信jssdk常见错误及解决方法

    调用config 接口的时候传入参数 debug: true 可以开启debug模式,页面会alert出错误信息.以下为常见错误及解决方法: invalid url domain当前页面所在域名与使用 ...

  4. centos linux 系统日常管理4 scp,rsync,md5sum,sha1sum,strace ,find Rsync 常见错误及解决方法 第十七节课

    centos linux 系统日常管理4  scp,rsync,md5sum,sha1sum,strace ,find Rsync 常见错误及解决方法  第十七节课 rsync可以增量同步,scp不行 ...

  5. VC6.0开发中一些链接错误的解决方法

    (1)error LNK2001: unresolved external symbol _main 编号:LNK2001 直译:未解决的外部符号:_main. 错误分析:缺少main函数.看看mai ...

  6. SQL Server2000企业管理器在Win7中新建表错误的解决方法

    Sql Server2000建表错误与解决方法: 在Windwos7中SQL Server 2000企业管理器在新建表时会提示错误,尝试各种方法均告无效,包括升级SP3和SP4,最终发现如下规律可以暂 ...

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

    问题原因]:工程中classpath中指向的包路径错误 [解决办法]:右键项目名称 BuildPath ---> Configure Build Paht...中,然后上面有几个选项卡找到 Li ...

  8. VS 编程常见错误及解决方法

    1. VS2013 无法打开包括文件:“cv.h"等一些头文件 解决方法: cv.h是build\include文件夹下的头文件,所在文件夹位置是D:\Program Files (x86) ...

  9. SSH三大框架的基本整合以及常见错误的解决方法

    一.新建项目 eclipse->file->new->other->Dynamic Web Project,project name为sshDemo 二.下载jar包 1.st ...

随机推荐

  1. 利用html 5 websocket做个山寨版web聊天室(手写C#服务器)

    在之前的博客中提到过看到html5 的websocket后很感兴趣,终于可以摆脱长轮询(websocket之前的实现方式可以看看Developer Works上的一篇文章,有简单提到,同时也说了web ...

  2. Windows 10 周年版尝鲜

    早在今年的 Build 大会上,微软就开始宣传最新的 Windows 10 周年版更新,炫了不少特技,直到昨天(2016/8/2 PST)才正式放出,相关新闻可以参考这里,正式的版本为 Version ...

  3. IOS Socket 01-网络协议基础知识

    1. 网络参考模型 OSI参考模型                                          TCP/IP参考模型 2. 七层简述 1)物理层:主要定义物理设备标准,如网线的接 ...

  4. 64位Windows下安装Redis教程

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/104.html?1455868495 Redis对于Linux​是官方支持 ...

  5. DDD~Unity在DDD中的使用

    回到目录 上一讲介绍了DDD中的领域层,并提到下次要讲Unity,所以这篇文章当然就要介绍它了,呵呵,Unity是Microsoft.Practices中的一部分,主要实现了依赖注入的功能,或者叫它控 ...

  6. 知方可补不足~sqlserver中的几把锁~续

    回到目录 之前写过相关的文章,对脏读,不可重复读,幻读都做了相当的研究,而今天在程序中又出现了这个问题,即当一条数据被update时,另一个线程同时发起了读的操作,这对于序列化级别的事务是不被允许的, ...

  7. from表单iframe原网页嵌入

    今天是巩固的from表单跟嵌入其他页面,同样的,学习到了新的知识. 温故而知新: iframe--在原页面嵌入其他页面,以窗口的样式 其中scrolling--滚动条 noresize--可调整大小 ...

  8. “胡”说IC——菜鸟工程师完美进阶

    “胡”说IC——菜鸟工程师完美进阶(数十位行业精英故事分享,顶级猎头十多年来经验总结,对将入或初入IC电子业“菜鸟”职业发展.规划的解惑和点拨.) 胡运旺 编著   ISBN 978-7-121-22 ...

  9. MySQL(二) 数据库数据类型详解

    序言 今天去健身了,感觉把身体练好还是不错的,闲话不多说,把这个数据库所遇到的数据类型今天统统在这里讲清楚了,以后在看到什么数据类型,咱度应该认识,对我来说,最不熟悉的应该就是时间类型这块了.但是通过 ...

  10. JSP网站开发基础总结《十一》

    继上一篇关于过滤器连总结后,本篇为大家详细介绍一下过滤器中过滤规则的dispatcher属性的使用,在servlet2.5中dispatcher的属性有四种,其中上一篇已经为大家介绍了error属性的 ...