Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WCF 入门 (17)

WCF 入门 (17)

作者头像
_淡定_
发布于 2018-08-24 02:55:13
发布于 2018-08-24 02:55:13
21500
代码可运行
举报
文章被收录于专栏:dotnet & javadotnet & java
运行总次数:0
代码可运行

前言

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

前段时间看了微软的SurfaceBook的视频,被惊艳到了,但是我没钱买啊。。。

第17集 WCF中未经处理的异常 Unhandled exceptions in WCF

这集讲一下WCF中服务端如果出现异常会怎么样。还是用上集的demo。

服务端代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class CalculatorService : ICalculatorService
    {
        public double Divide(int numerator, int denominator)
        {
            return numerator / denominator;
        }
    }

一个简单的除法,不考虑除0的情况,所以在客户端传入除数0来引发异常。

首先修改服务端的app.config 配置文件,先使用basicHttpBinding

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<endpoint address="" binding="basicHttpBinding" contract="CalculatorService.ICalculatorService">

然后把这个service host起来。

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

输入20 和 5 点击计算,得到4.

代码也很简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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节点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<endpoint address="" binding="wsHttpBinding" contract="CalculatorService.ICalculatorService">

然后在wsHttpBinding中启用reliableSession

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      <wsHttpBinding >
        <binding>
          <security mode ="None"/>
          <reliableSession enabled ="true"/>
        </binding>
      </wsHttpBinding>

host起来,然后更新服务端的服务引用,可以看到如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client = new CalculatorServiceClient();

然后就能重新调用了。

但是在实际的生产环境中,肯定不能在所有地方都加上这么一个new。下一集我们会学习一下如何把这个Exception转换城SoapFault(意思是要throw SoapFault Exception,而不要throw 普通的.net Exception),那样channel就不会被破坏了,session就可以保持了。

这集学习了不同Binding中WCF如何处理服务端的异常。

ThankYou!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-10-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
WCF 入门 (18)
这集的中心意思是WCF服务如果有异常,应该throw出来fault exception,而不是简单的默认的.net 的异常。
_淡定_
2018/08/24
2870
WCF 入门 (18)
WCF 入门 (21)
其实不太了解为什么第21集才讲这个Binding,下面都是一些概念性的东西,不过作为一个入门视频,了解一下也无妨吧。
_淡定_
2018/08/24
2650
WCF 入门(15)
大致看了一下,这个WCF视频里面总共有6集,这个是第一集,对WCF的异常做一个大致的入门介绍。
_淡定_
2018/08/24
2430
WCF 入门(15)
WCF 入门(19)
上一集介绍了使用SOAP fault而不是默认的.net Exception来避免由于异常使当前的channel进入faulted状态。这集介绍如何使用强类型的SOAP faults。
_淡定_
2018/08/24
2830
WCF 入门(19)
我的WCF之旅(1):创建一个简单的WCF程序
为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用。本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本结构。对那些对WCF不是很了解的读者来说,这个例子将带领你正式进入WCF的世界。 在这个例子中,我们将实现一个简单的计算服务(CalculatorService),提供基本的加、减、乘、除的运算。和传统的分布式通信框架一样,WCF本质上提供一个跨进程、跨机器以致跨网络的服务调用。在本例中,客户端和服务通过运行在相同的同一台机器上不同进程模拟,图1体现了客户端
蒋金楠
2018/02/07
9580
我的WCF之旅(1):创建一个简单的WCF程序
WCF学习笔记 5
服务通过 ServiceHost 进行寄宿。可以添加终结以暴露可被调用寻址和调用的资源。
小蜜蜂
2019/09/03
7360
WCF入门学习(4)
上一篇的学习中碰到一个问题,用地址http://localhost:8080/mex 访问元数据的时候一直提示400 bad request 错误,因为时间太晚了,查了好几遍代码,也没有发现问题。刚刚又试验了一下,解决方案分两步
_淡定_
2018/08/24
3630
WCF入门学习(4)
WCF配置文件与文件下载之坎坷路
题外话:本以为我会WCF了,精通WCF了,毕竟刚做过一个WCF的项目,不就是写写契约接口,然后实现接口,改下配置。最后用控制台或者服务发布一下,不就能用了。不就是简单ABC吗?不是So Easy吗?做第二个项目的时候我悲剧了,被碰的头破血流!忽然发现什么什么都不会(第一个项目比照网上教程一步一步弄的),连写一个简单hello world都写不出来。我之前还以为自己很懂了…… 一、WCF文件配置       为了不重蹈覆辙,这次争取把他整懂整透(当然这才是入门而已)。WCF很强大,它的强大跟它的配置有很大的
hbbliyong
2018/03/06
1.1K0
WCF技术剖析之二十一: WCF基本的异常处理模式[上篇]
由于WCF采用.NET托管语言(C#和NET)作为其主要的编程语言,注定以了基于WCF的编程方式不可能很复杂。同时,WCF设计的一个目的就是提供基于非业务逻辑的通信实现,为编程人员提供一套简单易用的应用编程接口(API)。WCF编程模式的简单性同样体现在异常处理上面,本篇文章的主要目的就是对WCF基于异常处理的编程模式做一个简单的介绍。 一、当异常从服务端抛出 对于一个典型的WCF服务调用,我个人倾向于将潜在抛出的异常费为两种类型:应用异常(Application Exception)和基础结构(Infr
蒋金楠
2018/01/16
8170
WCF技术剖析之二十一: WCF基本的异常处理模式[上篇]
WCF 入门 (16)
上周回母校见了一下大学老师,还有些同学,发现差距还是挺大的。。。圈子不一样,真的就什么都不一样了。。
_淡定_
2018/08/24
3030
WCF 入门 (16)
菜菜从零学习WCF二(设计和实现服务协定)
  服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作。
aehyok
2018/09/11
9110
菜菜从零学习WCF二(设计和实现服务协定)
WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务
在《基于IIS的WCF服务寄宿(Hosting)实现揭秘》中,我们谈到在采用基于IIS(或者说基于ASP.NET)的WCF服务寄宿中,具有两种截然不同的运行模式:ASP.NET并行(Side by Side)模式和ASP.NET兼容模式。对于前者,WCF通过HttpModule实现了服务的寄宿,而对于后者,WCF的服务寄宿通过一个HttpHandler实现。只有在ASP.NET兼容模式下,我们熟悉的一些ASP.NET机制才能被我们使用,比如通过HttpContext的请求下下文;基于文件或者Url的授权;H
蒋金楠
2018/01/16
1K0
WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务
WCF入门(22)
今年10月份想换工作,更新了一下简历,接到北京汉克时代面试邀请,去了。后来通过了。然后谈了薪资,各方面还算稳妥。同时短信方式向对方确认了本人入职要1个月时间,是否可以。对方回答可以。于是向原公司提出离职申请。在上周5办完所有手续。期间,11月6号接到电话说会发表格给我,让我填写个人信息,后在11月13号回复了邮件,确认了各种信息。
_淡定_
2018/08/24
2780
WCF入门(22)
我的WCF之旅(8):WCF中的Session和Instancing Management
我们知道,WCF是MS基于SOA建立的一套在分布式环境中各个相对独立的Application进行Communication的构架。他实现了最新的基于WS-*规范。按照SOA的原则,相对独自的业务逻辑以service的形式封装,调用者通过Messaging的方式调用Service。对于承载着某个业务功能的实现的Service应该具有Context无关性、甚至是Solution无关性,也就是说个构成Service的operation不应该绑定到具体的调用上下文,对于任何调用,具有什么样的输入,就会有与之对应的输出。因为SOA的一个最大的目标就是尽可能地实现重用,只有具有Context无关性/Solution无关性,Service才能实现最大限度的重用。此外Service的Context无关性/Solution无关性还促进了另一个重要的面向服务的特征的实现:可组合性,把若干相关细粒度的Service封装成一个整体业务流程的Service。
蒋金楠
2022/05/09
2800
我的WCF之旅(8):WCF中的Session和Instancing Management
WCF系列教程之WCF中的会话
本文参考自http://www.cnblogs.com/wangweimutou/p/4516224.html,纯属读书笔记,加深记忆 一、WCF会话简介 1、在WCF应用程序中,回话将一组消息相互关联,从而形成一个回话(回话可以理解为一段时间内的通话,有开始,有结束),会话是服务端和客户端的终结点在在开始回话和结束回话这段时间内的所有消息的一个集合。 2、WCF中的回话机制通过设置服务协定ServiceContract上的SessionMode的枚举值来设置服务协定是否要求、允许或者拒绝基于回话的绑定.枚
郑小超.
2018/01/26
8400
WCF 学习总结2 -- 配置WCF
前面一篇文章《WCF 学习总结1 -- 简单实例》一股脑儿展示了几种WCF部署方式,其中配置文件(App.config/Web.config)都是IDE自动生成,省去了我们不少功夫。现在回过头来看看IDE提供的Wcf Service Library项目模板中的默认服务端配置文件——App.config里面究竟有什么秘密。 服务端的配置文件主要是对services、bindings、behaviors的配置。在默认的App.config中,使用的是WCF Framework定义好的wsHttpBinding默
hbbliyong
2018/03/05
1.1K0
WCF 学习总结2 -- 配置WCF
WCF 入门(20)
今天第20集了。这个视频系列里面有6集和异常相关,这集是最后一集。前面几集讲了服务端遇到普通的 .net exception时候,要转换城Soap Fault,用fault Exception 或 FaultException<T>来处理。 上一集的例子中用了在主方法体上加大的try catch块来捕获异常,然后throw成FaultExcepiton,这个有个坏处,我们不可能在所有的方法上都加上这么一段,因为不仅代码上显得臃肿,而且加起来麻烦,到处的try-catch。这集就通过IErrorHandler接口来提供一种相对优雅很多的方法。
_淡定_
2018/08/24
2990
WCF 入门(20)
WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
在前面一片文章(服务代理不能得到及时关闭会有什么后果?)中,我们谈到及时关闭服务代理(Service Proxy)在一个高并发环境下的重要意义,并阐明了其根本原因。但是,是否直接调用ICommunic
蒋金楠
2018/01/16
2K0
WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
学会WCF之试错法——超时
服务契约 [ServiceContract] public interface IService { [OperationContract] string GetData(int value); [OperationContract] string GetString(string value); [OperationContract] void Upload(Request request)
甜橙很酸
2018/03/08
7180
学会WCF之试错法——超时
我的WCF之旅(10):如何在WCF进行Exception Handling
在任何Application的开发中,对不可预知的异常进行troubleshooting时,异常处理显得尤为重要。对于一般的.NET系统来说,我们简单地借助try/catch可以很容易地实现这一功能。但是对于 一个分布式的环境来说,异常处理就没有那么简单了。按照面向服务的原则,我们把一些可复用的业务逻辑以Service的形式实现,各个Service处于一个自治的环境中,一个Service需要和另一个Service进行交互,只需要获得该Service的描述(Description)就可以了(比如WSDL,Sc
蒋金楠
2018/02/07
5650
我的WCF之旅(10):如何在WCF进行Exception Handling
相关推荐
WCF 入门 (18)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验