WCF 入门 (17)
前言
看的是入门视频,就希望培养一个学习的习惯吧。
前段时间看了微软的SurfaceBook的视频,被惊艳到了,但是我没钱买啊。。。
第17集 WCF中未经处理的异常 Unhandled exceptions in WCF
这集讲一下WCF中服务端如果出现异常会怎么样。还是用上集的demo。
服务端代码:
public class CalculatorService : ICalculatorService
{
public double Divide(int numerator, int denominator)
{
return numerator / denominator;
}
}
一个简单的除法,不考虑除0的情况,所以在客户端传入除数0来引发异常。
首先修改服务端的app.config 配置文件,先使用basicHttpBinding
<endpoint address="" binding="basicHttpBinding" contract="CalculatorService.ICalculatorService">
然后把这个service host起来。

新建一个Winform客户端作为测试Client,界面如下:

输入20 和 5 点击计算,得到4.
代码也很简单:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
ICalculatorService client = null;
private void Form1_Load(object sender, EventArgs e)
{
client = new CalculatorServiceClient();
} private void btnCalc_Click(object sender, EventArgs e)
{
try {
int num = int.Parse(tbNumerator.Text.Trim()), denominator = int.Parse(tbDenominator.Text.Trim());
lbRst.Text = client.Divide(num, denominator).ToString();
} catch(Exception ex) {
lbRst.Text = ex.Message;
}
}
}
定义一个变量client,在form load的时候实例化,然后在点击计算按钮的时候计算结果,在label上显示结果。
下面我们试验一下除0的情况:

得到除0异常提示。
再试验20/5的情况:

如图,我们依旧能得到想要的结果。
下面我们来试验一下使用wsHttpBinding
先改配置文件的endpoint节点
<endpoint address="" binding="wsHttpBinding" contract="CalculatorService.ICalculatorService">
然后在wsHttpBinding中启用reliableSession
<wsHttpBinding >
<binding>
<security mode ="None"/>
<reliableSession enabled ="true"/>
</binding>
</wsHttpBinding>
host起来,然后更新服务端的服务引用,可以看到如下:
<endpoint address="http://localhost:8080/" binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_ICalculatorService" contract="CalculatorSerivce.ICalculatorService"
name="WSHttpBinding_ICalculatorService">
然后运行client,先试验一下正常的情况:

结果正常。
再来试验一下除0的情况:

得到异常提示。
再试验正常的情况,得到一个异常:

The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.
现在,无论除数是否为0,都无法再得到结果。
究其原因,是因为我们在wsHttpBinding中启用了reliableSession,当服务端有未经处理异常时,就会破坏传输的channel,使之进入Faulted 状态。
如果没有启动reliableSession,结果就和basicHttpBinding 一样。
最基本的解决方法就是要重新实例化一个ServiceClient。
client = new CalculatorServiceClient();
然后就能重新调用了。
但是在实际的生产环境中,肯定不能在所有地方都加上这么一个new。下一集我们会学习一下如何把这个Exception转换城SoapFault(意思是要throw SoapFault Exception,而不要throw 普通的.net Exception),那样channel就不会被破坏了,session就可以保持了。
这集学习了不同Binding中WCF如何处理服务端的异常。
ThankYou!
WCF 入门 (17)的更多相关文章
- WCF入门教程(图文)VS2012
WCF入门教程(图文)VS2012 上一遍到现在已经有一段时间了,先向关注本文的各位“挨踢”同仁们道歉了.小生自认为一个ITer如果想要做的更好,就需要将自己的所学.所用积极分享出来,接收大家的指导和 ...
- WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]
WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...
- 【转】WCF入门教程六[一个简单的Demo]
一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...
- 学习WCF入门的第一个实例
一.概述 WCF说白了就是一个基于终结点的通信手段!就是Service端提供一定的功能实现,然后暴露出一个或多个终结点,Client端调用Service端的功能(可以理解为调用一个函数),那么Clie ...
- WCF入门教程(五)配置文件
WCF入门教程(五)配置文件 服务协定以及实现写好后,需要将相关服务公布出去,就需要HOST来承载,供客户端来调用. 承载服务有两种方式,一种通过配置文件,一种通过代码进行配置.上一章已经介绍了代码方 ...
- WCF入门教程(四)通过Host代码方式来承载服务
WCF入门教程(四)通过Host代码方式来承载服务 之前已经讲过WCF对外发布服务的具体方式. WCF入门教程(一)简介 Host承载,可以是web,也可以是控制台程序等等.比WebService有更 ...
- WCF入门教程(三)定义服务协定--属性标签
WCF入门教程(三)定义服务协定--属性标签 属性标签,成为定义协议的主要方式.先将最简单的标签进行简单介绍,以了解他们的功能以及使用规则. 服务协定标识,标识哪些接口是服务协定,哪些操作时服务协定的 ...
- WCF入门教程(二)如何创建WCF服务
WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) ...
- WCF入门教程(一)简介
WCF入门教程(一)简介 1.WCF是什么? WCF( Windows Communication Foundation), 是Microsoft为构建面向服务的应用提供的分布式通信编程框架,是.NE ...
- [WCF编程]1.WCF入门示例
一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...
随机推荐
- 如何在WIN7下进行LINUX虚拟机搭建
Linux是一套免费使用和自由传播的类Unix操作系统,非常适用于搭建网络服务器等,我本人日常工作时,是使用的LINUX和WIN7双操作系统,但每次更换系统总要关机重启很不方便,所以也在WIN7下搭建 ...
- malloc calloc 和 realloc
realloc()函数 原型:extern void *realloc(void *mem_address, unsigned int newsize); 语法:指针名=(数据类型*)realloc( ...
- Hive beeline update
Hive cli vs beeline The primary difference between the two involves how the clients connect to Hive. ...
- OO的设计原则
今天同事和我们一起讨论分享了OO的设计原则,讨论使人明晰,有人一起讨论学习是一件幸福的事情. 1.开闭原则 对功能的扩展是开放的,对修改是闭合的. 可以应用于类的设计,框架的设计等. 为什么?开闭原则 ...
- SpringMVC 初始化网站静态信息
在网站开发中,一些元素经常被访问,例如 网页头部URL导航 的信息,以及Boot版权的信息,在各个页面都是重复出现的 如果每次渲染View都要通过Service层访问数据库 比较麻烦 也没有必要,但是 ...
- 将TP引擎改为smarty引擎
在common/config文件里设置'TMPL_ENGINE_TYPE'=>'Smarty'即可,但要注意,在模板文件里的css样式{}要用一对{literal}{/literal}标签包裹, ...
- js判断浏览器种类以及版本号(从jquery1.8中抠出来的)
var myLibs = { // Use of jQuery.browser is frowned upon. // More details: http://api.jquery.com/jQue ...
- JavaScript---Ajax和函数回调,异步编程
一 Ajax 函数的定义 : Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),无刷新的从服务器读取数据,可以在不重新加载整个网页的情况下 ...
- 导航 tab
- AndroidStudio .gitinore编写
# Built application files *.apk *.ap_ # files for the dex VM *.dex # Java class files *.class */R.ja ...