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!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cnblogs

Reactor模式的.net版本简单实现--DEMO

     近期在学习DotNetty,遇到不少的问题。由于dotnetty是次netty的.net版本的实现。导致在网上叙述dotnetty的原理,以及实现技巧...

41660
来自专栏程序员的SOD蜜

一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架

问题:3行代码 PDF.NET 是一个开源的数据开发框架,它的特点是简单、轻量、快速,易上手,而且是一个注释完善的国产开发框架,受到不少朋友的欢迎,也在我们公...

32090
来自专栏Create Sun

access基本操作(c#操作,远程连接,执行sql,加密,备份)

前言  最近项目用到了access,是的就是access,工作在桌面型的小数据库应用还是会用到的,如果你确定永远不会遇到access的操作,请忽略此篇文章 1....

43380
来自专栏林德熙的博客

UWP WPF 解决 xaml 设计显示异常

例如我创建一个用户控件 TsjcyubtnTtqtjem 那么就可以在构造函数添加下面代码

22620
来自专栏大内老A

如何解决分布式系统中的跨时区问题[原理篇]

《谈谈你最熟悉的System.DateTime[上篇][下篇]》从跨时区的角度对DateTime这个我们熟知的类型进行了深入探讨,它们都是为这篇文章作的准备工作...

20370
来自专栏JackieZheng

Java豆瓣电影爬虫——模拟登录的前世今生与验证码的爱恨情仇

前言 并不是所有的网站都能够敞开心扉让你看个透彻,它们总要给你出些难题让你觉得有些东西是来之不易的,往往,这也更加激发你的激情和斗志! 从《为了媳妇的一张号,...

50060
来自专栏dotnet & java

Bootstrap-3-Typeahead

是Bootstrap-3-Typeahead,不是Twitter open source的typeahead,两者用法有差异。外加如果配合原生的Bootstra...

21160
来自专栏圣杰的专栏

ABP入门系列(2)——领域层创建实体

这一节我们主要和领域层打交道。首先我们要对ABP的体系结构以及从模板创建的解决方案进行一一对应。网上有代码生成器去简化我们这一步的任务,但是不建议初学者去使用。...

26180
来自专栏walterlv - 吕毅的博客

.NET 命令行参数包含应用程序路径吗?

发布于 2018-09-11 13:28 更新于 2018-09...

10730
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)

我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决方案,原始我们是用js来控制的,现在不需要了。 我们只要创建简单的资源文件,通过...

35670

扫码关注云+社区

领取腾讯云代金券