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;
            }
        }

调用测试一下:

QQ截图20151103190217

如我们所愿。

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

Thank You !

posted @   Sheldon_Lou  阅读(806)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示