上一篇文章,我講解了 WCF 服務布置在 IIS 上面并被簡單實用的例子,這一篇文章,我就來說一說 WCF 的強大之處—多宿主制。
在說 WCF 之前,我們下來聊一聊當下項目中使用較多的 SOA 方式都有什么,并討論一下他們的優缺點。
Web Service:可以說是比較古老的方式,但是即使在當下這個技術層出不窮的時代,仍然保留著一席之地,這說明 Web Service 還是有一定的可取之處的,其缺點固然很直接,那就是 Web Service 走的 Soap 協議,其生成的文件十分龐大,舉圖說明:
這也是Web Service令人發指的地方,特別是在當前移動互聯火爆的年代,生成一個 Soap 格式的文件需要的流量要多很多,所以這也是其逐漸走向沒落的主要原因,但是我們不能否認他的優點,那就是學習成本低,簡單易用,上手快,這對一些小型公司來講無疑是具有致命的吸引力的。
WCF:這種技術是在 .net 3.0 時代出現的,可以說是標志性的,其功能強大,不僅可以支持多種協議( http、tcp... ),還可以托管在多種應用程序上,而且相對來說更安全,對用戶權限驗證方面的功能做的更好,但是,功能越強大,學習成本越高,很多人不怎么喜歡 WCF 這種技術,因為它的配置文件會讓很多程序樣抓狂(我也是這樣)。但是不得不說 WCF 的功能是真的強大。
WebAPI:簡單的來講,WebAPI 這項技術是現如今比較火爆的了,優點就在于與手機端的交互,其生成的是 json 格式的文件,體積小,輕便(有人做過測試,同樣的字符串用不同的格式返回所占的體積大小各不相同,最大的是 Soap 格式的,其次是 Xml ,最小的是二進制的,json?比二進制稍微大一點),這樣會為手機端用戶剩下不少流量。只支持 http 協議,發送的請求也是 http 請求。也可以支持多宿主托管。
從上面的分析我們不難看出,在功能方面來講 WCF 可以說是最強大的,但是學習周期和成本來說比較高,所以很多公司對其嗤之以鼻,但是還是不能妨礙其功能強大的特點。接下來我們就來講一下 WCF 是如何在控制臺程序上面發布服務并被調用的。
還是之前的那個程序:接下來我導入一些別人寫好的例子(原諒我是個懶比,這例子代碼太多了,還有配置文件,我本來也是想手寫的,但是很累,所以真的不怪那么多人不喜歡 WCF 配置文件是真的煩)
看結構目錄很好理解, Hosting 是控制臺程序, Interface 是接口文件 ,Model 是一個模型, Service 里邊封裝了一些遠程調用的方法即 IIS 篇中的 .svc 文件。接下來我們來看一看難點:
上圖是我們配置之后的固定格式,說實話,這些代碼是什么意思真的不好理解,看的我是云里霧里的,,但既然是固定寫法,,我們暫時先不去深究,喜歡研究的同學可以私下研究研究。既然稱之為難點,對于新手來講,即使是固定寫法,在你不了解的情況下,想要寫出來也是很難的,所以我們可以使用另一種方法:
可以使用這種可視化界面來編輯 WCF 的配置文件,然后自動填充到配置文件中去
之后,后臺代碼就會變成:
是不是有一種撥開云霧見青天的爽快感。從上圖的代碼中我們可以發現,實際之前的一大堆代碼最后就是簡化成了兩句代碼,也就是說之前的那一堆代碼很多都是可以寫到配置文件里邊的,這樣學習起來也不算特別困難。
我們可以試一下,以管理員的身份運行程序,這一點是必須要記住的,建議各位在打開 vs2017 的時候就以管理員的身份運行,這樣也方便一些。
接下來我們用另一個測試類調用一下,看看是否能成功調用到部署在控制臺程序上邊的服務。
需要注意的是想要找到部署在控制臺的服務跟找到部署在 IIS 的服務是一樣的,需要打開部署的程序的,也就是讓控制臺程序運行,不然會出現主機連接不積極的報錯。至于地址就是在配置文件里邊的 address 節點。
引用之后就很簡單了,跟部署在 IIS 的操作基本都是一樣的,
從上圖中我們看到,遠程調用方法已經可以使用了,從結果上來講我們已經成功了,但是我們觀看一下被調用的代碼發現了另一個問題
在這個方法所生成的實體中我們看到是有 Id=13 這一條的,但是我們在遠程獲取到的結果中卻沒有看到 Id 這一屬性,這就要說到我們在 Model 中定義屬性的時候所添加的另一個特性契約了。
我們發現,Id屬性的 [ DataMember ] 特性被注釋之后,就無法從遠程獲取到了這個屬性,包括我之前說過的 [ OperationContract ]特性,前者是某屬性如果不被標識[ DataMember ]特性就不會被遠程獲取,后者是某方法如果不被標識[ OperationContract ]特性就不會被遠程獲取,這樣大大的提高了安全性。
以上就是 WCF 部署在控制臺上的簡單調用,,