WCF理論 【轉載】

原文地址:http://blog.itpub.net/23109131/viewspace-661613/html

 

WCF是什麼?web

WCF是"Windows Communication Foundation "的縮寫,利用它可以開發出分佈式(Distributed)應用程序,使用它能建立安全的(Secure)、可靠的(Reliable)、跨平臺的(transacted messaging along with interoperability)的分佈式解決方案。它能夠支持跨應用程序域(AppDomain),進程(Process),網絡(NetWork)的進行數據通信,並且能寄宿在諸如IIS,Windows Service,Console,Windows Application等多種宿主(Host)中。並且開發難度相比之前的.Net Remoting和Asp.Net Xml Web Service等都有了大幅度的下降。其最大的特徵在於1)充分整合了原來的.Net Remoting,Asp.Net Xml,WebService,MSMQ,WSE,Enterprise Service等多項分佈式技術,取其精華,棄其糟粕。2)WCF雖然整合了幾項技術,但開發難度不增反降,簡單易學。編程

WCF能幹什麼?windows

在win32中,應用程序是運行在進程(Process)的線程(Thread)中的,.Net平臺出現以後,出現了AppDomain,其實就至關於在進程和線程之間又有了一層包裝,相似於子進程的概念,在一個進程(或者應用程序域)中的對象能進行直接的訪問和控制,但超出這個範圍,便不能進行直接的訪問和控制了,因此說進程(或者應用程序域)有必定的隔離做用,若是是分佈在不一樣網絡,不一樣操做系統上的不一樣進程,他們進行通信的難度就更大,而分佈式應用程序要求的就是將本來被隔離的做用域經過必定的契約聯繫起來,從而達成多個系統的溝通協做。固然能實現這種目的的方式遠不止WCF一個,好比在win32時代,常用映射內存文件來實現進程之間的互操做問題,還有在windows程序中,用windows消息wm也能實現不一樣進程之間的通信問題,但這些都有侷限性,由於他們不能很好的解決跨平臺,跨網絡問題,而WCF能夠。安全

WCF與其餘分佈式技術區別服務器

 

Xml Web Service網絡

.Net Remoting數據結構

Enterprice Service框架

WSEtcp

MSMQ

WCF

跨平臺

       

.Net與.Net通信

 

     

分佈式事務

   

   

安全可靠性

     

 

消息隊列

       

 

WCF彷佛等於前面幾項技術之和,它還具備本身的優勢:1。統一性,2。互操做性,3。安全可靠,4。兼容性

WCF在安全性方面作的改進

爲了保證數據通信的安全,WCF提供了三種保護措施:1)機密性(Confidentiality)2)完整性(Integrity) 3)可驗證性(Authentication),這三種措施聯合起來被稱爲CIA。而且這些措施在WCF中是默認支持的。機密性能保證傳輸的數據是通過加密的,不被非法監聽(eavesdrop),而完整性利用數字簽名技術防止數據在傳輸過程當中被注入(injected)或篡改(tampered),而驗證(Authentication)能夠採用靈活的策略來處理達到的客戶端請求,好比用戶名密碼驗證,客戶端證書驗證等。

爲了跟蹤Web Service和WCF的消息,咱們還須要瞭解一下兩個工具:

  1. Microsoft SOAP Toolkit Version 3 中的 Trace Utility 不能跟蹤WCF報文
  2. tcpTrace

原來一直用Trace Utilty來跟蹤xml web service的消息報文,很是好用,它能按包顯示出Soap信息,看起來也很是方便。有關它的消息,請從http://www.microsoft.com/downloads/details.aspx?FamilyId=C943C0DD-CEEC-4088-9753-86F052EC8450&displaylang=en 上下載SOAP Toolkit 3.0,安裝後,便出現了這個工具,在跟蹤xml web service的消息報文的時候,這個工具很好用,但跟蹤wcf的報文卻不行,能截獲到數據,但每一個報文都是空的,可能也和wcf報文是通過加密的有關係吧,同時建議你們使用tcpTrace.

WCF在性能方面有那些改進?

分別測試循環1000次對wcf和xml web service相同功能方法的調用,獲得以下的數據:

  WCF Web Service
第一次 9523ms 7561ms
第二次 9480ms 7465ms
第三次 9508ms 7708ms
第四次 9487ms 7900ms

 

通過四次測試數據,咱們能夠得出,wcf的性能和xml web service相比的確要低,但差異不大,確定在一個數量級之上。

什麼是契約?

任何一個分佈式應用程序,它之因此可以互相傳遞消息,都是事先制定好數據交換規則的,這個規則正是交換數據的雙方(好比服務器端和客戶端)能彼此理解對方的依據,WCF做爲分佈式開發技術的一種,一樣具備這樣一種特性。而在WCF中制定的的規則就被稱之爲契約(Contract),它是WCF的消息標準,是任何一個wcf程序不可或缺的一部分。

在WCF中,契約分爲四種,它們分別爲:

  • 用於定義服務操做的服務契約:Service Contract 
    這種級別的契約又包括兩種:ServiceContract和OperationContract 
    ServiceContract用於類或者結構上,用於指示WCF此類或者結構可以被遠程調用,而OperationContract用於類中的方法(Method)上,用於指示WCF該方法可被遠程調用。
  • 用於自定義數據結構的數據契約:Data Contract 
    數據契約也分爲兩種:DataContract和DataMember.DataContract用於類或者結構上,指示 WCF此類或者結構可以被序列化並傳輸,而DataMember只能用在類或者結構的屬性(Property)或者字段(Field)上,指示WCF該屬性或者字段可以被序列化傳輸。
  • 用於自定錯誤異常的異常契約:Fault Contract 
    FaultContract用於自定義錯誤異常的處理方式,默認狀況下,當服務端拋出異常的時候,客戶端能接收到異常信息的描述,但這些描述每每格式統一,有時比較難以從中獲取有用的信息,此時,咱們能夠自定義異常消息的格式,將咱們關心的消息放到錯誤消息中傳遞給客戶端,此時須要在方法上添加自定義一個錯誤消息的類,而後在要處理異常的函數上加上FaultContract,並將異常信息指示返回爲自定義格式。
  • 用於控制消息格式的消息契約:Message Contract 
    簡單的說,它能自定義消息格式,包括消息頭,消息體,還能指示是否對消息內容進行加密和簽名。

如何定義契約?

其實上面落裏羅嗦說了一大堆,彷佛契約使用起來應該很難的樣子了,可事實上,契約的使用是很簡單的,它無非就是在普通的程序結構上添加一些聲明性的屬性就能夠了,好比咱們能夠直接在類上聲明ServerContractAttribute,此時這個類就能被遠程客戶端訪問到,而在類中的方法中(Method)添加OperationContractAttribute就能將方法暴露給遠程客戶端,其餘的契約也同樣的用法,比較可貴仍是消息契約和錯誤契約,當也很簡單。我這裏沒有WCF開發環境,因此具體怎麼用,我就不作示例了,您仍不明白的話,能夠參考下面幾篇文章:

http://www.cnblogs.com/artech/archive/2007/02/28/659331.html

http://www.rainsts.net/article.asp?id=427

http://www.rainsts.net/article.asp?id=429

http://www.rainsts.net/article.asp?id=430

WCF做爲一種可以跨平臺的體系框架,獨立於平臺以外,它只約束通信的雙方應該遵照什麼樣的規則,而絲絕不管雙方各自採用的是什麼樣的技術和什麼樣的操做系統,也就是說若是有異構,異網的狀況,根本不影響WCF。

Address是什麼?

一個要和服務端通信的客戶端要作的第一件事情,就是搞清數據要發給誰?目的地在哪?而Address正是經過一個Uri來惟一標示一個WCF的終節點(EndPoint)的,它標示了消息發送的目的地。在WCF 數據通信中,它解決了服務在哪裏的問題。

Address的組成?

Address在WCF中的用System.ServiceModel.EndpointAddress對象來表示的,它的結構以下:

此外,Address還包括IsAnonymous屬性,用於指示終節點是否能匿名訪問。

如何在配置文件中指定Address?

在配置文件中,有兩種方式能夠指定Address,一種是絕對地址方式,另外是相對地址方式,分別以下:

絕對地址

 <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8731/" />
          baseAddresses>
   host>
   <endpoint address ="http://localhost:8731/Service" binding="basicHttpBinding"
 contract="Wcf_Address_Config.IService1"> endpoint>

相對地址

 <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8731/" />
          baseAddresses>
  host>
  <endpoint address ="Service1" binding="basicHttpBinding" 
      contract="Wcf_Address_Config.IService1">endpoint>

在網上有人說絕對地址是經過將httpGetEnabled設置爲true,而且設置httpGetUrl爲絕對地址是在設置endPoint的說法有些不許確,由於在WCF中有兩種地址,一種是訪問endPoint時候用到地址,另一種是服務描述的地址,服務描述在wcf中被稱做serviceMetadata,經過它可以產生代理類,好比,咱們作以下的設置:

 <serviceMetadata httpGetEnabled="True" httpGetUrl="http://localhost:8731/Service"/>

只表明在http://localhost:8731/Service/?wsdl上能找到服務描述,能夠經過http://localhost:8731/Service/?wsdl生成代理類,而不是將endPoint的地址設置爲了http://localhost:8731/Service,這點必定要注意,不要受有些說法的誤導。

如何經過編程方式設置Address?

除了能在配置中設置Address外 ,還能夠經過編程的方式來設置Address,具體方法請參參見下面的代碼示例:

 static void Main(string[] args)
        {
            EndpointAddress address = new EndpointAddress("http://127.0.0.1:2136/Service1");           
            Binding binding = new BasicHttpBinding();
            wcf.IService1 service = new wcf.Service1Client(binding, address);
            Console.WriteLine(service.GetData(2));
            Console.Read();
        }

上面的代碼就是將endPoint的地址設置爲了http://127.0.0.1:2136/Service1

Address有什麼特殊應用?

在wcf中,可以將服務同時發佈到幾個地址上面,只要這些地址採用的都是一種訪問方式。這種一份程序,多個發佈地址的作法,在以往的技術中是沒有的。

WCF相關文章http://www.csharpwin.com/search.aspx?ChID=0&AID=0&KW=WCF

WCF技術研究團 http://wcfs.cnblogs.com/
相關文章
相關標籤/搜索