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 ...
随机推荐
- CI 框架中 AR 操作
Model 层中的部分代码 /** * CI 中的 AR 操作 * @author zhaoyingnan **/ public function mAR() { /*************** 查 ...
- R语言Cairo包的使用
Cairo使用起来非常简单,和基础包grDevices中的函数对应. CairoPNG---grDevices:png(). CairoTIFF---grDevices:tiff(). CairoPD ...
- [部署]CentOS配置IP地址
环境 虚拟机:VMWare10.0.1 build-1379776 操作系统:CentOS7 64位 简介 CentOS7最小化安装(Minimal)时,是不带ifconfig指令的,该指令在net- ...
- Linux学习之二——档案与目录的属性和权限
一.属性和权限的基本概念 Linux一般将档案可存取的身份分为三个类别,分别是 owner/group/others,这三种身份各有 read/write/execute 等权限. 所有的系统上的账号 ...
- TFS 2015 Update 2功能探索
微软刚刚发布了TFS 2015 update 2的测试包,https://blogs.msdn.microsoft.com/bharry/2016/02/10/team-foundation-serv ...
- 递归:codevs 1251 括号
codevs 1251 括号 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 计算乘法时,我们可以添加括号,来改变相乘的顺 ...
- MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- 为Unity项目生成文档(二)
Unity项目生成文档 接着上篇文章:为Unity项目生成文档(一) .Net项目可在VS配置XML 我们可以在VS中通过配置来生成xml文件,但是unity的project,就算同样配置了xml文档 ...
- Unity的物理材质
Physic Materials资源包 在Unity中的项目导入Unity自带的资源包 Physic Materials,自带的资源包有不同种类的物理材质: Bouncy:有弹性的 Ice:结冰 Me ...
- 创建自定义的Cocos2d-x场景
操作步骤 1.创建cocos2d-x工程 2.新建 Scene1.cpp Scene1.h Scene1.h代码 #ifndef __SCENE1_H__#define __SCENE1_H__ #i ...