前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WCF 入门(19)

WCF 入门(19)

作者头像
_淡定_
发布2018-08-24 10:55:40
2510
发布2018-08-24 10:55:40
举报
文章被收录于专栏:dotnet & javadotnet & java

前言

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

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

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

总共有3个步骤:

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

代码语言:javascript
复制
    [DataContract]
   public  class DivideByZeroFault
    {
        [DataMember]
        public string Error { get; set; }
        [DataMember]
        public string Details { get; set; }

    }

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

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

代码语言:javascript
复制
    [ServiceContract]
    public interface ICalculatorService
    {
        [FaultContract(typeof(DivideByZeroFault))]
        [OperationContract]
        double Divide(int numerator, int denominator);
    }

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

代码语言:javascript
复制
    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块做一下修改,改成如下:

代码语言:javascript
复制
        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;
            }
        }

调用测试一下:

QQ截图20151103190217
QQ截图20151103190217

如我们所愿。

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

Thank You !

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 第19集 创建然后抛出强类型的SOAP faults  Creating and throwing strongly typed SOAP faults
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档