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并进行调用的时候,碰到类似的问题,能够很好解决问题,节省宝贵的时间。
WCF连接被意外关闭的更多相关文章
- WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭
在我们开发WCF项目的时候,常常会碰到一些莫名其妙的错误,有时候如果根据它的错误提示信息,一般很难定位到具体的问题所在,而由于WCF服务的特殊性,调试起来也不是那么方便,因此往往会花费不少时间来进行跟 ...
- c# 基础连接已经关闭: 连接被意外关闭,错误的解决
原文:c# 基础连接已经关闭: 连接被意外关闭,错误的解决 调试一个使用HttpWebRequest模拟提交表单的程序的时候频繁出现上述错误提示,google了一下发现了几个解决方案.1.在appli ...
- Post数据到 https异常:基础连接已经关闭: 连接被意外关闭 解决办法
POST数据到HTTPS站点的时候需要设置ServicePointManager类的ServerCertificateValidationCallback属性,并且在POST到https://pass ...
- WebClient.DownLoadString报错:连接被意外关闭
调用WebClient的DownLoadString方法调用接口,当数据量比较小的时候(十几条数据)一切正常.后来对方突然放了一千多条数据,然后就报错了:连接被意外关闭. 先是以为是对方接口没有在输出 ...
- httpWebRequest请求错误,基础连接已经关闭: 连接被意外关闭
win10下,C# 用httpWebRequest 执行post请求出现"请求错误,基础连接已经关闭: 连接被意外关闭",经测试设置 //Post请求方式 System.Net.H ...
- C#使用FtpWebRequest 基础连接已经关闭:连接被意外关闭(The underlying connection was closed:The connection was closed unexpectedly)
公司内部开发的winform程序使用了FtpWebRequest下载FTP服务器的文件到本地. 大多数人运行良好,由于我们是试运行逐步有人加入到平台的使用,前两天突然有个别机器无法连接FTP服务器报出 ...
- c#中 HttpWebRequest请求抛异常,基础连接已经关闭: 连接被意外关闭
在用httpWebRequest模拟请求的时候有时因为服务器等方面做了请求的限制, 在请求会出现基础连接已经关闭: 接收时发生意外错误的错误 一般原因是因为服务器不允许与 Internet 资源建立持 ...
- 解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题。 (默认mysql连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池。系统发布第二天访问链接关闭问题。
解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题. (默认MySQL连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池. 所以系统发布第二天访问会 ...
- MySQL意外关闭, 导致软件崩溃而无法启动的解决办法
在初次搭建XAMPP,Apache和MySQL都可以正常启动,一旦关机重启XAMPP时,发现Apache可以正常启动:而MySQL却不能正常运行,会碰到 Error: MySQL shutdown u ...
随机推荐
- jQuery整理笔记文件夹
jQuery整理笔记文件夹 jQuery整理笔记一----jQuery開始 jQuery整理笔记二----jQuery选择器整理 jQuery整理笔记三----jQuery过滤函数 jQuery整理笔 ...
- HDU 2120 Ice_cream's world I(并检查集合)
职务地址:HDU 2120 这题尽管字数不多,但就是看不懂. . 意思是求最多有多少个被墙围起来的区域.显然就是求环的个数.然后用并查集求环个数就能够了. 代码例如以下: #include <i ...
- ABP应用层——应用服务(Application services)
ABP应用层——应用服务(Application services) 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之15.ABP应用层——应用服务(Applic ...
- 十天学Linux内核之第八天---构建Linux内核
原文:十天学Linux内核之第八天---构建Linux内核 今天是腊八节,说好的女票要给我做的腊八粥就这样泡汤了,好伤心,好心酸呀,看来代码写久了真的是惹人烦滴,所以告诫各位技术男敲醒警钟,不要想我看 ...
- MySQL进口.sql文件和常用命令
MySQL进口.sql文件和常用命令 在MySQL Qurey Brower中直接导入*.sql脚本,是不能一次运行多条sql命令的.在mysql中运行sql文件的命令: mysql> so ...
- NSOJ 一个人的旅行(图论)
虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿 ...
- Java数据结构与算法(13) - ch06递归(归并排序)
时间为O(N*logN). 归并排序的一个缺点是它需要在存储器中有另一个大小等于被排序的数据项数目的数组.归并两个有序的数组.利用递归,不断的将数组进行二分法排序,然后进行归并即可.
- HTML5使用和实战分析HTML5 WebSocket API
通过引入一个简单的界面(请参见下面的列表),开发替代技术,由于长轮询和"永远框架,从而进一步减少延迟. 后台代码 [Constructor(in DOMString url, optiona ...
- VC编程 快捷键增加的几种方式
VB运行时菜单字母的下划线消失 vc 给菜单增加快捷键RT给Menu里面的 文件 帮助 查看 等功能键加上一个快捷方式.比如按Ctrl+F1 就弹出查看下面的子功能.------解决方案------- ...
- MySql创建一个存储过程
MySQL 存储过程是从 MySQL 5.0 新功能.存储过程的长处有一箩筐.只是最基本的还是运行效率和SQL 代码封装. 特别是 SQL 代码封装功能,假设没有存储过程,在外部程序訪问数据库时(比如 ...