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.

  • 相关阅读:
    房地产英语 Real estate词汇
    自制Flash FLV视频播放器
    .net反编译工具Reflector下载
    JQUery插件thickbox
    50 Great Photoshop Tutorials for Clever Beginners
    AspNet中你或许不知道的技巧(转)
    常用的设计网站(收藏)
    35 Green and Earthy Photoshop Effects
    使用 ASP.NET 2.0 增强网站的安全性
    asp.net中实现登陆的时候用SSL
  • 原文地址:https://www.cnblogs.com/sheldon-lou/p/4925177.html
Copyright © 2011-2022 走看看