我希望能用連續的幾篇博文,記錄下自己學習WCF的過程,同時也為了能和大家一起交流分享自己學習WCF的心得。
學習WCF的英文資料對英文基礎不太好的人來說有些難以接受了,中文書籍不太多,好不容易有兩本,又寫的像研究生畢業論文一樣。
所以,我想寫點自己的WCF文章,希望能對自己的WCF知識起到促進作用,又能和大家一起交流,幫助到大家理解WCF。
宗旨:我不會用中文的專業術語(例如:協定,地址,綁定,通道,終結點,宿主,單工、雙工,回調等),因為用一個英文單詞可以被多個人翻譯成多個中文詞語,這樣不好。我堅持使用英文的原本單詞(如:contract,Address,binding,pipe,endpoint,host,one-way ,duplicate,call back)。
本人最為“痛恨”那種滿口專業術語講技術概念的人。如果學習所有的技術都要先被大量技術名詞搞暈掉,那學習實在是太痛苦了。我見識過這樣的一本書:當你隨意翻開一頁,隨意找出一段讀一讀,會發現根本不知道作者在講什么,因為全是難懂的技術名詞和概念。遇到這種情況,英文再差的人寧可去讀英文資料。我崇尚的技術教學或交流是通俗易懂的。不論多么復雜的新/舊技術,能簡單的一定簡簡單單的講出來。做到這一點其實不難,個人認為,作者只需用自己的話來講就完全可以,越是照搬學術的東西,“貌似權威的”,卻是缺少大眾親和力。畢竟大部分人學習的目的不是去作秀寫論文,而是去寫自己的實實在在的代碼的。呵呵。願IT界的明天更加美好吧。
閑言少敘,書歸正傳。
=======================================================================
WCF被推出來很久了,但是對於剛剛接觸WCF的人們來說,想必會有以下問題:
WCF是什么?為什么我們需要WCF?WCF能給我們帶來什么?學習WCF的難易度如何?
以上這些問題的答案在網上已經很多介紹了,我在此本不必再浪費口舌,只是大概提一下。
WCF: Windows Communication Foundation.從名字可以看出,這是一項和通信密切相關的技術。我們知道軟件設計到處是通信。當然我們必須學了以后,才能更好的知道它、運用它,而不能單單從它的名字揣測它的威力如何。
WCF提供給了我們一種面向服務(SOA)的程序設計的解決方案:何為面向服務?之前有使用過.NET Web Service 開發的朋友,很容易理解面向服務是咋回事。.Net Web Service也是更早的時候微軟提出的一種面向服務的解決方案。面向服務是一種標准,不同的公司可以給出各自的實現框架。單純的講SOA,畢竟太抽象了。學習一下SOA的一種實現比如.Net Web Service 或WCF以后,相信不用任何文字定義,你也會深刻地理解SOA。所以,何為面向服務?這里不解釋,等你學一段時間的WCF,你自己就有答案了,真的,呵呵。
WCF提供了統一的通信模型:以前我們寫通信可以是:TCP/UDP,Socket等這些方式,在WCF中被統一了。至於如何統一?這里先不說了。所以,當你在項目中同時使用了多種通信方式時,可以考慮使用WCF了。
以前沒有接觸過Web Service 開發接受WCF也不是難事,相信我!
這次,我們只做一點WCF的概述,更為詳細的知識到后面再慢慢展開。邊學習,邊交流。
1. 打開VS 2010 -->file-->new Project ,選擇C#下面的WCF,選擇WCF Library。如下圖:
2.此時有了IService 文件和一個Service 文件。Service文件實現的IService中的兩個函數:GetData函數和GetDataUsingDataContract函數。至於這兩個函數是干嘛的?想必不用說大家都能看懂的。之后詳細說明他們的角色。這里也不修改類名和函數名了,方面起見。
3.按F5運行程序,此時打開了一個WCF 的一個測試 窗口。如下圖:先測試GetData函數
測試結果:
同樣的方法測試GetDataUsingDataContract函數:結果如下圖
4.上面完成了對WCF的函數功能的簡單測試,能說明的是Service正確地實現了IService。接下來我們需要將這個WCF部署到一個Web Site中。
在解決方案上面右擊:New -->New Web Site 如下圖:
修改web site項目中的Service.svc 文件里面的 Service="WcfFirstDemoServiceLib.Service1" (其中意思就是已命名空間加類名的方式指定service的名字)
5.添加一個winForm程序 ,用它來調用WCF的函數。
6.給winForm 項目添加web 引用:
7.在Form1上面添加幾個控件,然后再在Form1.cs中添加下列幾行代碼:

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using WCFClient.WCFServiceDemo; 10 11 namespace WCFClient 12 { 13 public partial class Form1 : Form 14 { 15 Service1Client proxy = null; 16 CompositeType ctin = null; 17 CompositeType ctout = null; 18 public Form1() 19 { 20 InitializeComponent(); 21 } 22 23 private void btnGetData_Click(object sender, EventArgs e) 24 { 25 this.tbOutputBox.Text = proxy.GetData(Convert.ToInt32(this.tbInputbox.Text)); 26 } 27 28 private void Form1_Load(object sender, EventArgs e) 29 { 30 proxy = new Service1Client(); 31 32 } 33 34 private void button2_Click(object sender, EventArgs e) 35 { 36 ctin = new CompositeType(); 37 ctin.StringValue = this.tbInputCTStrvalue.Text; 38 ctin.BoolValue = this.rboxInTrue.Checked; 39 40 ctout = proxy.GetDataUsingDataContract(ctin); 41 42 this.tbOutputCTStrvalue.Text = ctout.StringValue; 43 if (ctout.BoolValue) 44 { 45 this.rboxOutTrue.Checked = true; 46 } 47 else 48 { 49 this.rboxOutFalse.Checked = true; 50 } 51 52 } 53 } 54 }
8.Ctrl+F5 運行:
說明:這里只是概述WCF,所以全部在使用WCF的默認設置,也沒有詳細說明每一步的作用是什么。只是給出三個項目:項目1是WCF的庫也是WCF功能核心。項目2是WCF的host用於向外界發布WCF提供的接口(注:接口這里指提供了哪些函數可被調用)。項目3是WCF的客戶端用於調用WCF。其實,這里已經隱約體現出一點點分布式軟件架構的意思了:有專門提供功能實現的模塊,有專門提供對外公開接口的模塊,有專門作為調用的模塊。
后面詳細WCF每一部分的。歡迎關注!!