zoukankan      html  css  js  c++  java
  • WCF 入门 (18)

    前言

    感冒了呀。。。but 不忌油炸,不忌辛辣,o(∩_∩)o 。

    第18集 WCF服务应该抛出fault 异常 Throwing fault exceptions from a WCF service

    这集的中心意思是WCF服务如果有异常,应该throw出来fault exception,而不是简单的默认的.net 的异常。

    原因有两个:

    1. 一个未经处理的.net 异常会使当前的ServiceClient所在的channel进入faulted状态。然后当前的代理类就不能再用,需要重新create一个。但是fault exception不会。关于这个faulted state,可以看这里

    2. 普通的.net 异常和平台相关,只能被.net的客户端识别,如果客户端是java的,就不好玩了。这个有点像.net remoting。

    配置文件不变,是启用reliableSession的wsHttpBinding,Divide做如下改动:

        public class CalculatorService : ICalculatorService
        {
            public double Divide(int numerator, int denominator)
            {
                if(denominator == 0) {
                    throw new FaultException(new FaultReason("denominator can't be 0"), new FaultCode("denominator is 0"));
                }
                return numerator / denominator;
            }
        }

    手动判断除数是否为0,如果为0, throw一个 FaultException。FaultException用来表示一个基于xml的和平台无关的SOAP,这样就确保了客户端的平台无关性。

    QQ截图20151031110239

    下面来试验一下效果:

    1. host起这个service

    QQ截图20151031110504

    2. 客户端代码不变,不过可以更新一下服务引用(试了不更新也没问题。)

    3. 先试验除数为0的情况

    QQ截图20151031110630

    其实前面抛出的FaultReason 和 FaultCode都是可以获取的。可以这么改:

                    lbRst.Text = ex.Code.Name + " - " + ex.Message;
                    lbRst.Text = ex.Code.Name + " - " + ex.Reason.ToString();

    4, 如果没有在服务端throw FaultException,并且客户端没有create 一个new proxy instance,由于channel进入了Faulted状态,将无法再使用同一个ServiceClient。现在我们已经改成了FaultException,再试验了一下。

    QQ截图20151031111254

    it works。

    如果在实际的coding中,应该是在服务端的代码上加个大的try-catch块,然后在catch块中throw出一个FaultException。

    Thank you.

  • 相关阅读:
    我眼中的SCRUM
    文本转换程序
    免费接口
    看板,敏捷的另一种实现方式
    Android Asynchronous Http Client-Android异步网络请求客户端接口
    hdu4753 Fishhead’s Little Game 状态压缩,总和一定的博弈
    dbcp、c3p0、jdbc常用连接配置
    IE安全分析
    redis入侵小结
    heartbleed漏洞利用
  • 原文地址:https://www.cnblogs.com/sheldon-lou/p/4925177.html
Copyright © 2011-2022 走看看