zoukankan      html  css  js  c++  java
  • 年前辞职-WCF入门学习(5)

    前言

    第五集比较简单,视频也只有7分多钟,但是用处还是挺大的。下面我会介绍。

    本来想第六集一起介绍的,后来发现第六集内容比较多,有半个多小时,就不一起了。网站规定6小时内只能发布一篇文章到首页,,那我就11点再发布吧。

    第五集 How to make changes to WCF service without breaking clients (在不修改客户端的情况下更新WCF服务)

    这集的大部分代码用的是第三集的内容。他的场景是这样的:假设我们已经写好了服务,但是某天重构代码的时候发现有个ServiceContract名字需要修改,服务端当然没事,改接口名字,改配置文件,一切顺利。但是客户端就不那么轻松了,我最先想到的就是客户端重新引用服务,显然这是一种极其不合理的方法,因为那样所有调用这个合约的地方都要去修改。。。否则就是一个Error。

    这集提供了一个解决方法,假设我们新的ServiceContract名字为IHelloServiceChanged,那么只需要修改他的ServiceContract特性的Name 属性,是不是很简单。代码如下:

        [ServiceContract(Name = "IHelloService")]
        public interface IHelloServiceChanged
        {
            [OperationContract]
            string GetMessage(string name);
        }
    那为什么这样可行呢?
    让我们来看一下两者的mex,通过地址栏里面输入 http://localhost:8080/mex
    首先是原先的,我们搜索一下portType关键字,我们只截取关键的:
    QQ截图20150111211058 

    我们看到这里有个name属性,名字是IHelloService;

    然后再看当合约接口的名字改成IHelloServiceChanged之后:

    QQ截图20150111211248

    name变成了IHelloServiceChanged。

    我们知道,客户端在添加服务引用,然后生成本地的代理类的时候,是通过解析服务提供的mex地址中的xml描述信息来执行的,所以,我们只要让这个name还是保持原来的名字,服务端任他变动都没有关系。

    再来看看给ServiceContract 特性添加name属性之后的mex内容:

    QQ截图20150111211649

    可知,name属性已变为我们定义的内容。

    ServiceContract 特性用来定义类的名字,里面的OperationContract用来定义方法的名字,如果某天我们改变了方法的名字,又不想让客户端重新引用,只需要定义OperationContract的name属性。

    第五集介绍完毕。

    Thank you!

  • 相关阅读:
    利用Filter和拦截器,将用户信息动态传入Request方法
    Spring统一返回Json工具类,带分页信息
    ASP.NET MVC4 学习记录
    lightgbm 的简单实践案例
    numpy和pandas 各种比较常见的用法总结
    【数据预处理】如何将某一类别特征的极少数类别归为一类
    十大经典算法之Apriori 算法
    常用函数框架
    【解决方案】django初始化执行python manage.py migrate命令后,除default数据库之外的其他数据库中的表没有创建出来
    【解决方案】M2Crypto不支持python3
  • 原文地址:https://www.cnblogs.com/sheldon-lou/p/4217153.html
Copyright © 2011-2022 走看看