http://www.cnblogs.com/myg2006/archive/2008/03/09/1097189.html
WCF --- Windows Communiction Foundation,是一個Microsoft推出已久的技術。已久有很多人寫了不少關於WCF的文章,比如談談WCF系列等,都是很好的文章。我只是想說一些基礎的東西,然後寫一個例子,讓目前剛開始學習WCF的人有一個感性的瞭解,希望能給他們的學習帶來一點用處,同時是自己對WCF認識加深的一個過程。
WCF是一個統一的,可用於建立安全,可靠的面向服務的應用高效的開發平台。WCF是構建安全可靠的事務性服務的統一架構。它是一種構建分布式面向服務系統的非常豐富的技術基礎,它統一了訊息風格和RPC[Remote Procedure Call]風格,並且通過二進位和基於開放標準的通訊達到了平台最佳化。
它整合了.Net平台下所有的和分布式系統有關的技術,例如ASP.NET Web服務(ASMX)、增強Web服務擴充(WSE)、.Net Remoting、企業服務(Enterprise Service)和微軟訊息佇列(MSMQ)。
而要理解WCF,你首先要理解WCF基本的組成部分,分別為:
- Message --- Soap Message, WCF不僅支援XML格式,而且還支援更加高效的Binary格式
- Header --- Message的Header,通常是附屬資訊,可以零個或多個
- Body --- Message的Body,通常是主題資訊,可以零個或多個
- Channel --- 傳輸Message的通常,可以建立多個Channel,通常包括下面四部分資訊,但一般不用我們指定,而是在配置Service/Endpoint中指定
- Security --- 傳輸安全性
- Message Securty --- Message的安全性,通常驗證方式有Windows Authentication 或 X.509 或 Custom
- Authentication --- 驗證
- Integrity --- 訊息完整性
- Confidentiality --- 訊息機密性,加密解密
- Auditing --- 審核
- Transport Security --- Transport的安全性
- Https --- 針對Http來說的安全傳輸
- Other
- Interoperability --- 互動性,我的理解是,可以替代的服務類型
- WebService
- WSE
- .Net Remoting
- Enterprise Service
- MSMQ
- Other
- Message pattern --- Message的傳輸方式
- Simplex --- 單向傳輸,如A-->B
- Duplex --- 雙向傳輸,如A<---->B,A先發送資訊到B,B返回一個狀態,然後A再發Message,然後B Response
- Request-Respose --- 要求/回複,A-->B,B-->A
- Transport --- 傳輸類型,Message是通過什麼形式傳輸的
- Http --- 無需儲存串連狀態
- Tcp --- 需要儲存串連狀態,在Exchange Data的時候,會維護一個State
- MSMQ --- 通常用於需要可靠的Message傳輸的時候
- Named Pipes --- 通常用於單個PC的不同處理序間通訊
- Service
- Service
- Contract --- 契約
- Data Contract --- 資料契約,告訴程式該資料可以用於WCF傳輸,通常用來指定我們自訂的Model對象,是serializable的一種類型,命名空間為System.Runtime.Serialize。
- Service Contract --- 服務契約,告訴程式這是該一個WCF服務
- Operation Contract --- 操作契約,告訴程式,這是該Service對外暴露的可以執行的操作
- Implementation --- Operation Contract的具體實現
- Endpoint --- 在外界看來,服務的串連接地址
- Address --- 服務的具體地址,根據Transport類型,可以是Http,Tcp等
- Binding --- 下面的表徵圖是Binding的不同類型
-
- Contract --- 對外暴露的介面
- Behavior --- Service在執行時,要執行的一個行為,比如安全驗證
- Throttling --- 決定同一時間一個Service可以使用的Thread數量、Service的執行個體數,傳遞的Message數量
- Security --- 決定Service的安全特性
- Instancing --- 決定Service實作類別的可以建立的執行個體數
- PerCall --- 用戶端的每次Request都會產生一個InstanceContext
- PerSession --- 根據每個用戶端的Session來產生一個InstanceContext,並且和這個Session有相同的生命週期
- Single --- 單例模式
- Error Handling --- 但Service遇到異常並且需要返回資訊時的處理方式
- Concurrency --- 控制一個InstanceContext可以跨多少個線程
- Multiple --- 可以跨多個線程
- Single --- 只能在單行程內執行
- Reentrant --- Each instance of the service can only process messages one at a time but can accept re-entrant operation calls
- Transactions --- 決定Service是否可以接受並執行來自用戶端的事務.注意事務是用戶端建立的,因此事務的完成與否由用戶端決定,當然生命週期也是如此。
- Custom --- 自訂行為
- Host --- WCF的寄宿主,即運行Service的地方
- Console Application
- Web Application
- WinForms Application
- IIS
- Service
下面我做一個簡單一實例來說明一下,一個WCF的開發,調用過程。
一,首先我們建立一個Console Application,叫做WCFDemo
二,我們既然要開發WCF,當然要引入一個WCF Service Application了,叫做Service,如果你不想建立單獨的項目,你可以在別的項目中添加WCF Service的Item。在建立WCF Project的時候會自動產生IService和Service.svc,通常IService這個Service Contract我們是不會要的,因為調用Service的Client也需要用,所以我們會把他們放到統一的地方,本例中是叫Interface的項 目。單純的Service.svc是很簡單的一個實現了IService介面的一個類,沒有什麼特別之處,
1: namespace Service
2: {
3: // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file.
4: public class Service : IService
5: {
6: public Computer GetComputer()
7: {
8: Computer computer = new Computer();
9: computer.ComputerName = "Ralax - PC";
10: return computer;
11: }
12: }
13: }
需要注意的是,ServiceClient繼承關係,以及建構函式
ServiceClient完成後,就是Client的調用了,如下:
1: namespace WCFDemo
2: {
3: class Program
4: {
5: static void Main(string[] args)
6: {
7: using(ServiceClient sClient = GetService())
8: {
9: Console.WriteLine(sClient.GetComputer().ComputerName);
10: Console.Read();
11: }
12: }
13:
14: public ServiceClient GetService()
15: {
16: WSHttpBinding binding = new WSHttpBinding();
17: EndpointAddress address = new EndpointAddress(new Uri("http://localhost/WCFDemo/Service.svc"));
18: ServiceClient client = new ServiceClient(binding, address);
19: return client;
20: }
21: }
22: }
這個例子,我已經打包了,可以在這裡下載:http://files.cnblogs.com/myg2006/WCFDemo.rar
wcf開發學習:http://www.cnblogs.com/jillzhang/category/121346.html