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!

  • 相关阅读:
    寒假瞎搞系列(5)
    《亿级用户下的新浪微博平台架构》阅读笔记
    《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》阅读笔记
    《游戏服务器的架构演进(完整版)》阅读笔记
    阅读架构漫谈(四)笔记
    阅读架构漫谈(三)笔记
    阅读架构漫谈(二)笔记
    以《淘宝网》为例,描绘质量属性的六个常见属性场景
    阅读架构漫谈(一)笔记
    假期周进度总结2
  • 原文地址:https://www.cnblogs.com/sheldon-lou/p/4217153.html
Copyright © 2011-2022 走看看