专栏首页dotnet & javaWCF 入门(19)

WCF 入门(19)

前言

天气转凉,提前过冬了。感冒依旧没好,因为双休日伙食太好了,各种鱼各种肉。

第19集 创建然后抛出强类型的SOAP faults  Creating and throwing strongly typed SOAP faults

上一集介绍了使用SOAP fault而不是默认的.net Exception来避免由于异常使当前的channel进入faulted状态。这集介绍如何使用强类型的SOAP faults。

总共有3个步骤:

1. 创建一个类用来表示SOAP fault,给类加上DataContract特性(因为客户端要用这个),里面的属性用DataMember特性修饰。

    [DataContract]
   public  class DivideByZeroFault
    {
        [DataMember]
        public string Error { get; set; }
        [DataMember]
        public string Details { get; set; }

    }

Error用来放异常信息,Details用来放自定义内容。

2. 给OperationContract 修饰的Divide方法加上FaultContract特性修饰。表明这个方法可能会抛DivideByZeroFault。

    [ServiceContract]
    public interface ICalculatorService
    {
        [FaultContract(typeof(DivideByZeroFault))]
        [OperationContract]
        double Divide(int numerator, int denominator);
    }

3. 把原先的throw FaultException改成泛型的FaultException<T>

    public class CalculatorService : ICalculatorService
    {
        public double Divide(int numerator, int denominator)
        {
            try {
                return numerator / denominator;
            } catch(DivideByZeroException ex) {
                throw new FaultException<DivideByZeroFault>(new DivideByZeroFault()
                {
                    Error = ex.Message,
                    Details = "Denominator can't be zero"
                });
            } catch(Exception ex) {
                throw new FaultException(ex.Message, new FaultCode("Unknow Code"));
            }
        }
    }

如果是除零异常,则抛出FaultException<DivideByZeroFault>的,否者抛出普通的FaultException。

服务端的OK了,下面更新一下客户端调用。

首先更新一下服务引用。然后对客户端catch块做一下修改,改成如下:

        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(FaultException<DivideByZeroFault> ex) {
                lbRst.Text = ex.Detail.Error + " - " + ex.Detail.Details;
            } catch(Exception ex) {
                lbRst.Text = ex.Message;
            }
        }

调用测试一下:

如我们所愿。

这集好像挺简单的,讲了如何使用FaultException<T>来添加自定义的error message。

Thank You !

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WCF入门(6)

    昨天早上去医院做入职体检,被告知要预约,本以为是要排队,我连视频都准备好了。。。结果就回来了。下午去了新公司那边找房子,2了,因为公司提供了班车列表,我既然就只...

    _淡定_
  • WCF入门(10)

    公司是做乙方的,工资还凑合,主要是项目基本都已完成,进去就是干维护,体会不到那种从头彻尾的成就感。项目中具体用了EF+Ado.net+WCF+WPF+(VB.n...

    _淡定_
  • 讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute

    ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性,今天主角就是 ApiControllerAttribute. (注:文...

    _淡定_
  • 并发编程之线程协作

    爱撒谎的男孩
  • 计算机程序的思维逻辑 (2) - 赋值

    赋值 上节我们说了数据类型和变量,通过声明变量,每个变量赋予一个数据类型和一个有意义的名字,我们就告诉了计算机我们要操作的数据。 有了数据,我们能做很多操作。但...

    swiftma
  • mybatis学习之高级映射

    一对一映射查询 1、数据库执行脚本: /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.7.11-log : Datab...

    用户1141560
  • RecyclerView的通用快速适配封装

    其实这篇博客是我后面一篇博客的准备~一句话实现RecyclerView的单选多选的选项列表

    1025645
  • 初探Google Guava

    第一次接触我是在16年春github上,当时在找单机查缓存方法,google guava当初取名是因为JAVA的类库不好用,所以谷歌工程师自己开发一套,想着go...

    爱撸猫的杰
  • spring开发_BeanPostProcessor_Bean后处理器

    http://www.cnblogs.com/hongten/gallery/image/112581.html

    Hongten
  • 张高兴的 Windows 10 IoT 开发笔记:FM 电台模块 KT0803L

    张高兴

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动