前言

看的是入门视频,就希望培养一个学习的习惯吧。

前段时间看了微软的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)的更多相关文章

  1. WCF入门教程(图文)VS2012

    WCF入门教程(图文)VS2012 上一遍到现在已经有一段时间了,先向关注本文的各位“挨踢”同仁们道歉了.小生自认为一个ITer如果想要做的更好,就需要将自己的所学.所用积极分享出来,接收大家的指导和 ...

  2. 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代码方式来 ...

  3. 【转】WCF入门教程六[一个简单的Demo]

    一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...

  4. 学习WCF入门的第一个实例

    一.概述 WCF说白了就是一个基于终结点的通信手段!就是Service端提供一定的功能实现,然后暴露出一个或多个终结点,Client端调用Service端的功能(可以理解为调用一个函数),那么Clie ...

  5. WCF入门教程(五)配置文件

    WCF入门教程(五)配置文件 服务协定以及实现写好后,需要将相关服务公布出去,就需要HOST来承载,供客户端来调用. 承载服务有两种方式,一种通过配置文件,一种通过代码进行配置.上一章已经介绍了代码方 ...

  6. WCF入门教程(四)通过Host代码方式来承载服务

    WCF入门教程(四)通过Host代码方式来承载服务 之前已经讲过WCF对外发布服务的具体方式. WCF入门教程(一)简介 Host承载,可以是web,也可以是控制台程序等等.比WebService有更 ...

  7. WCF入门教程(三)定义服务协定--属性标签

    WCF入门教程(三)定义服务协定--属性标签 属性标签,成为定义协议的主要方式.先将最简单的标签进行简单介绍,以了解他们的功能以及使用规则. 服务协定标识,标识哪些接口是服务协定,哪些操作时服务协定的 ...

  8. WCF入门教程(二)如何创建WCF服务

    WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) ...

  9. WCF入门教程(一)简介

    WCF入门教程(一)简介 1.WCF是什么? WCF( Windows Communication Foundation), 是Microsoft为构建面向服务的应用提供的分布式通信编程框架,是.NE ...

  10. [WCF编程]1.WCF入门示例

    一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...

随机推荐

  1. 用Qemu模拟vexpress-a9 (四) --- u-boot引导kernel,用nfs挂载根文件系统

    环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 32 u-boot 版本:u-boot-2015-04 Linux kernel版本:linux-3.16.y busyb ...

  2. Hello world S.B.S.

    #include <iostream> #include <conio.h> #include<cstdio> #include<cstring> #i ...

  3. 【温故而知新-CSS】使用CSS设计网站导航栏

    body #nav li a { width: auto; } #nav li a:hover { background-color: #ffcc00; color: #fff; border-rig ...

  4. Linux (二) vi

    1  步骤 1)  vi  test.txt 进入一般模式 2)   i    进入编辑模式,输入内容 3)  Esc 回到一般模式 4)  :wq 存储后退出 2  编辑模式 [i] 光标处插入, ...

  5. 怎么在ZBrush中渲染漫画风格的插画

    创建“漫画插画”的外观和感觉想必一定很有趣吧,但是,获得想要的精确外观有时也会令人相当沮丧,因此了解一些基本原则,创建类似于ZBrush漫画MatCaps的作品很有必要. 若有疑问亦或者想查看具体的视 ...

  6. java10-1 Object类

    Object:类      Object 是类层次结构的根类.每个类都使用 Object 作为超类. 每个类都直接或者间接的继承自Object类. Object类的方法: public int has ...

  7. android应用中去掉标题栏的方法

    现在我坚定的认为写技术博客对自己有很大的帮助,写博客给自己一个学而思的机会. 在Android中去掉标题栏有三种方法,它们也有各自的特点. 1.在代码里实现 this.requestWindowFea ...

  8. 研:手势与眼动相结合-手势SDK的整合

    Leap提供了SDK.但是整合有很多的问题,写博客记录一下: 写一个类:SampleListener.cpp以及头文件SampleListener.h. 这里主要碰到的问题是找不到以及冲突问题: 这里 ...

  9. 25Mybatis_查询缓存的基本知识

    mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级和二级缓存的示意图:

  10. WEB 安全之 SQL注入<一> 盲注

    SQL注入是一个比较"古老"的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果 ...