前言
第五集比較簡單,視頻也只有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關鍵字,我們只截取關鍵的:
我們看到這里有個name屬性,名字是IHelloService;
然后再看當合約接口的名字改成IHelloServiceChanged之后:
name變成了IHelloServiceChanged。
我們知道,客戶端在添加服務引用,然后生成本地的代理類的時候,是通過解析服務提供的mex地址中的xml描述信息來執行的,所以,我們只要讓這個name還是保持原來的名字,服務端任他變動都沒有關系。
再來看看給ServiceContract 特性添加name屬性之后的mex內容:
可知,name屬性已變為我們定義的內容。
ServiceContract 特性用來定義類的名字,里面的OperationContract用來定義方法的名字,如果某天我們改變了方法的名字,又不想讓客戶端重新引用,只需要定義OperationContract的name屬性。
第五集介紹完畢。
Thank you!