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.

posted @ 2015-10-31 11:22  Sheldon_Lou  阅读(567)  评论(0编辑  收藏  举报