原文地址:http://www.cnblogs.com/PirateCaptain/articles/1960954.htmlhtml
什麼是WCF?WCF全名Windows Communication Foundation,中文叫Windows通訊基礎,MS的名字起的多麼的樸實合適,是Windows平臺下開發和部署服務的軟件開發包。WCF爲服務提供了運行時環境(屢次看到運行時,這玩意究竟幹了什麼這麼重要呢?),使得開發者可以以CLR類型的方式使用服務(CLR類型是什麼呢?能幹嘛?這個問題得去.NET框架程序設計裏去找答案)。WCF的大部分功能都在System.ServiceModel這個.NET命名空間裏,至少須要.NET3.0的支持。操做系統至少XPsp2以上。編程
我粗淺的理解是這樣的:跨域
什麼是服務?WINDOWS操做系統裏有不少服務(Services),基本是本地計算機使用的,服務其實吧就跟生活中同樣,是一個抽象的概念,是面向組件的上一層概念,好多國內公司作軟件服務外包,說的再通俗點,就是我給你錢,你給我作我指定的事情,怎麼作我無論,我只從你這邊拿到我想要的東西。WCF裏的服務能夠是跨網跨域的,不跨就沒啥意義了,不然怎麼叫分佈式呢?再往前追溯就是Dcom,再上去就是Cobra,日後就是Indigo,實際上是早期MS對WCF的稱呼代號。安全
服務是公開的一組功能的集合。客戶端與服務經過消息的發送和接受進行交互,WCF中的全部消息均爲SOAP消息(xml之類的東東,上Google好好了解下)。WCF的消息與傳輸協議無關,而WEB服務(WS)則與傳輸協議有關(限於HTTP)。WCF服務一般經過公開元數據的方式描述可用的功能以及服務可能採用的通訊方式,元數據的發佈能夠預先定義,它與具體的技術無關(如WSDL),非WCF客戶端也能夠將元數據做爲本地類型導入到本地環境中,而後以本地CLR類與接口的方式進行調用,怎麼理解這句話,其實吧,說白了就是導入服務上的類型到本地類型,而後調用本地類型,由於你的VS2008不可能直接使用網絡上的元數據,你的編程測試都是本地的(代理類相關的東西)。網絡
WCF不容許客戶端直接與服務交互,那麼客戶端只能老是使用Proxy代理將調用轉發給服務(這就像公司裏的技術和客戶之間會有銷售作協調工做同樣,具備不少的好處),WCF的編程模型要求即便是本地調用,仍然使用遠程編程模型的實例化方式,並使用代理。框架
地址 WCF的每個服務都具備一個惟一的地址。地址包含服務位置和傳輸協議,或者是用於服務通訊的傳輸樣式。如下是一些實例,其實和網址相似:異步
http://localhost:8080 http://localost:81/Service net.tcp://localhost:8082 net.msmq://localhost 等等.WCF1.0支持的傳輸樣式有 HTTP,TCP,Peer network,IPC,MSMQ等。tcp
TCP地址:採用net.tcp協議進行傳輸,一般包括端口號,默認808。2個TCP能夠共享一個端口號(可是後面的服務要求不是同一個)。分佈式
HTTP地址:採用http協議,也能夠用https進行安全傳輸,默認端口80,也能夠共享端口號。測試
IPC地址:採用net.pipe進行傳輸,這就是說它將使用Windows的命名管道機制。在WCF中,使用命名管道的服務只能接受來自同一臺機器的調用,所以使用時要指明本地機器名或者localhost爲管道提供一個惟一的標識符,每臺機器只能打開一個命名管道,所以2個命名管道地址也不能共享一個管道名。
MSMQ:協議時net.msmq,即微軟消息隊列,必須爲msmq指定隊列名。若是是私有隊列,還須要指定隊列類型,共有的隊列類型能夠省略
Peer network:對等網地址,協議net.p2p。(GOOGLE上好好了解,掌握)
下面開始介紹WCF的另一些概念
契約:WCF的全部服務都會公開爲契約,契約和平臺無關,有4種,服務契約ServiceContract,數據契約DataContract,錯誤契約FaultContract,和消息契約MessageContract。
服務契約示例,
[ServiceContract (NameSpace="tempUrl")] //默認http://tempurl.org
[ServiceContract (Name="tempName")] //定義別名
託管方式有 IIS託管(要求.NET4.0),自託管(最簡單的就是本身作個Winform).重點看看託管的高級特性。
宿主類型ServiceHost實現的接口ICommunicationObject定義了一些高級特性,好好看看。
using System; namespace System.ServiceModel { // 摘要: // 爲系統中全部面向通訊的對象(包括通道、通道管理器、工廠、偵聽器以及調度程序和服務主機)定義基本狀態機的協定。 public interface ICommunicationObject { // 摘要: // 獲取面向通訊的對象的當前狀態。 // // 返回結果: // 對象的 System.ServiceModel.CommunicationState 的值。 CommunicationState State { get; } // 摘要: // 當通訊對象完成從正在關閉狀態轉換到已關閉狀態時發生。 event EventHandler Closed; // // 摘要: // 當通訊對象首次進入正在關閉狀態時發生。 event EventHandler Closing; // // 摘要: // 當通訊對象首次進入出錯狀態時發生。 event EventHandler Faulted; // // 摘要: // 當通訊對象完成從正在打開狀態轉換到已打開狀態時發生。 event EventHandler Opened; // // 摘要: // 當通訊對象首次進入正在打開狀態時發生。 event EventHandler Opening; // 摘要: // 使通訊對象當即從其當前狀態轉換到關閉狀態。 void Abort(); // // 摘要: // 開始一個異步操做以關閉通訊對象。 // // 參數: // callback: // 接收異步關閉操做完成通知的 System.AsyncCallback 委託。 // // state: // 一個由應用程序指定的對象,它包含與異步關閉操做相關聯的狀態信息。 // // 返回結果: // 引用異步關閉操做的 System.IAsyncResult。 // // 異常: // System.ServiceModel.CommunicationObjectFaultedException: // 對處於 System.ServiceModel.CommunicationState.Faulted 狀態的對象調用了 System.ServiceModel.ICommunicationObject.BeginClose()。 // // System.TimeoutException: // 在 System.ServiceModel.ICommunicationObject 可以正常關閉以前所通過的默認超時。 IAsyncResult BeginClose(AsyncCallback callback, object state); // // 摘要: // 開始一個異步操做以在指定超時內關閉通訊對象。 // // 參數: // timeout: // System.Timespan,指定在超時前必須完成發送操做的時間。 // // callback: // 接收異步關閉操做完成通知的 System.AsyncCallback 委託。 // // state: // 一個由應用程序指定的對象,它包含與異步關閉操做相關聯的狀態信息。 // // 返回結果: // 引用異步關閉操做的 System.IAsyncResult。 // // 異常: // System.ServiceModel.CommunicationObjectFaultedException: // 對處於 System.ServiceModel.CommunicationState.Faulted 狀態的對象調用了 System.ServiceModel.ICommunicationObject.BeginClose()。 // // System.TimeoutException: // 在 System.ServiceModel.ICommunicationObject 可以正常關閉以前所通過的指定超時。 IAsyncResult BeginClose(TimeSpan timeout, AsyncCallback callback, object state); // // 摘要: // 開始一個異步操做以打開通訊對象。 // // 參數: // callback: // 接收異步打開操做完成通知的 System.AsyncCallback 委託。 // // state: // 一個由應用程序指定的對象,它包含與異步打開操做相關聯的狀態信息。 // // 返回結果: // 引用異步打開操做的 System.IAsyncResult。 // // 異常: // System.ServiceModel.CommunicationException: // System.ServiceModel.ICommunicationObject 沒法打開而且已進入 System.ServiceModel.CommunicationState.Faulted // 狀態。 // // System.TimeoutException: // 在 System.ServiceModel.ICommunicationObject(已經進入 System.ServiceModel.CommunicationState.Faulted // 狀態)可以進入 System.ServiceModel.CommunicationState.Opened 狀態以前所通過的默認打開超時。 IAsyncResult BeginOpen(AsyncCallback callback, object state); // // 摘要: // 開始一個異步操做以在指定時間間隔內打開通訊對象。 // // 參數: // timeout: // System.Timespan,指定在超時前必須完成發送操做的時間。 // // callback: // 接收異步打開操做完成通知的 System.AsyncCallback 委託。 // // state: // 一個由應用程序指定的對象,它包含與異步打開操做相關聯的狀態信息。 // // 返回結果: // 引用異步打開操做的 System.IAsyncResult。 // // 異常: // System.ServiceModel.CommunicationException: // System.ServiceModel.ICommunicationObject 沒法打開而且已進入 System.ServiceModel.CommunicationState.Faulted // 狀態。 // // System.TimeoutException: // 在 System.ServiceModel.ICommunicationObject(已經進入 System.ServiceModel.CommunicationState.Faulted // 狀態)可以進入 System.ServiceModel.CommunicationState.Opened 狀態以前所通過的指定超時。 IAsyncResult BeginOpen(TimeSpan timeout, AsyncCallback callback, object state); // // 摘要: // 使通訊對象從其當前狀態轉換到關閉狀態。 // // 異常: // System.ServiceModel.CommunicationObjectFaultedException: // 對處於 System.ServiceModel.CommunicationState.Faulted 狀態的對象調用了 System.ServiceModel.ICommunicationObject.Close()。 // // System.TimeoutException: // 在 System.ServiceModel.ICommunicationObject 可以正常關閉以前所通過的默認關閉超時。 void Close(); // // 摘要: // 使通訊對象從其當前狀態轉換到關閉狀態。 // // 參數: // timeout: // System.Timespan,指定在超時前必須完成發送操做的時間。 // // 異常: // System.ServiceModel.CommunicationObjectFaultedException: // 對處於 System.ServiceModel.CommunicationState.Faulted 狀態的對象調用了 System.ServiceModel.ICommunicationObject.Close()。 // // System.TimeoutException: // 在 System.ServiceModel.ICommunicationObject 可以正常關閉以前所通過的超時。 void Close(TimeSpan timeout); // // 摘要: // 完成一個異步操做以關閉通訊對象。 // // 參數: // result: // 經過調用 System.ServiceModel.ICommunicationObject.BeginClose() 方法返回的 System.IAsyncResult。 // // 異常: // System.ServiceModel.CommunicationObjectFaultedException: // 對處於 System.ServiceModel.CommunicationState.Faulted 狀態的對象調用了 System.ServiceModel.ICommunicationObject.BeginClose()。 // // System.TimeoutException: // 在 System.ServiceModel.ICommunicationObject 可以正常關閉以前所通過的超時。 void EndClose(IAsyncResult result); // // 摘要: // 完成一個異步操做以打開通訊對象。 // // 參數: // result: // 經過調用 System.ServiceModel.ICommunicationObject.BeginOpen() 方法返回的 System.IAsyncResult。 // // 異常: // System.ServiceModel.CommunicationException: // System.ServiceModel.ICommunicationObject 沒法打開而且已進入 System.ServiceModel.CommunicationState.Faulted // 狀態。 // // System.TimeoutException: // 在 System.ServiceModel.ICommunicationObject(已經進入 System.ServiceModel.CommunicationState.Faulted // 狀態)可以進入 System.ServiceModel.CommunicationState.Opened 狀態以前所通過的超時。 void EndOpen(IAsyncResult result); // // 摘要: // 使通訊對象從已建立狀態轉換到已打開狀態。 // // 異常: // System.ServiceModel.CommunicationException: // System.ServiceModel.ICommunicationObject 沒法打開而且已進入 System.ServiceModel.CommunicationState.Faulted // 狀態。 // // System.TimeoutException: // 在 System.ServiceModel.ICommunicationObject(已經進入 System.ServiceModel.CommunicationState.Faulted // 狀態)可以進入 System.ServiceModel.CommunicationState.Opened 狀態以前所通過的默認打開超時。 void Open(); // // 摘要: // 使通訊對象在指定時間間隔內從已建立狀態轉換到已打開狀態。 // // 參數: // timeout: // System.Timespan,指定在超時前必須完成發送操做的時間。 // // 異常: // System.ServiceModel.CommunicationException: // System.ServiceModel.ICommunicationObject 沒法打開而且已進入 System.ServiceModel.CommunicationState.Faulted // 狀態。 // // System.TimeoutException: // 在 System.ServiceModel.ICommunicationObject(已經進入 System.ServiceModel.CommunicationState.Faulted // 狀態)可以進入 System.ServiceModel.CommunicationState.Opened 狀態以前所通過的指定超時。 void Open(TimeSpan timeout); } }
WAS託管:Windows激活服務(WAS)是一個系統服務,只適用於WINDOWS vista,是IIS7的一部分。
綁定 Binding
參考代碼
<bindings>
<wsHttpBinding>
<binding name="WoDebinding" >
<security mode="None"></security>
</binding>
</wsHttpBinding>
</bindings>
一個綁定封裝了諸如傳輸協議,消息編碼,通訊模式,可靠性,安全性,事務傳播以及互操做性等相關選項的集合,使得他們保持一致。
綁定中的格式與編碼
終結點
說白了就是提供服務的每個對外接口。
<endpoint
name="endpoint1"
address=""
binding="wsHttpBinding"
contract="StreamTranlate.IService1"
bindingConfiguration="WoDebinding" /> <!--注意啊,binding值不能亂寫,只有固定的幾個值,具體看上圖-->
對於編程來講有意義的事情來了,編程方式配置終結點.