年前辭職-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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM