WCF讀書筆記

來源:互聯網
上載者:User

        WCF是MS基於SOA(Service Oriented Architecture)推出的.net平台下的架構產品。WCF是使用Managed 程式碼建立和運行面向服務應用程式的統一架構。它使得開發人員能夠建立一個跨平台的安全,可信賴,事務性的解決方案,且能與已有系統相容協作。WCF是MS分布式應用程式開發的集大成者,它整合了.Net平台下所有的和分布式系統有關的技術。

WCF的優勢:

1.統一性

  WCF是一些技術的整合,WCF是完全由Managed 程式碼編寫,因此開發WCF的應用程式與開發其它的.Net應用程式沒有太大的區別。

2.互通性

  WCF最基本的通訊機制是SOAP,這就保證了系統之間的互通性,即使是運行不同的上下文中。這種通訊可以是基於.net到.net間的通訊.可以跨進程,跨機器甚至於跨平台的通訊,只要支援標準的WebService.應用程式可以運行在windows作業系統下。

3.安全與可信賴

 在Soap的header中增加了WS-ReliableMessaging允許可信賴的端對端通訊。

4.相容性

安裝WCF並不會影響原有的技術(ASMX,Remoting)

WCF Service由一個Endpoints集合組成,每個Endpoint就是用於通訊的入口,用戶端和服務端通過Endpoint交換資訊。

Address是Endpoint的網路地址,它標記了訊息發送的目的地。

Binding描述的是如何發送訊息。(如:訊息發送的傳輸協議TCP,HTTP)

Contract描述的是訊息所包含的內容,以及訊息的組織和操作方式。(one-way,duplex,request/reply)

Endpoint中的ABCs分別代表的含義是:where,how,what.

當WCF發送訊息時,通過address知道訊息的發送的地址,通過binding知道怎樣來發送它,通過contract知道發送的訊息是什麼。

在WCF中,類ServiceEndpoint代表一個Endpoint,在類中包含的EndpointAddress,binding,ContractDescription類型分別對應Endpoint的Address,Binding,Contract. 

 

 

 

 

 

 
EndPointAddress類又包含URI,Idnentity,可選的headers集合組成

Endpoint安全的唯一性識別通常是通過其URI的值

(但為了避免一些特殊情況造成URI的重複,又引入了Identity附加到URI上,保證了Endpoint地址的唯一性)

 至於可選的AddressHeader則提供了一些附加的資訊,尤其是當多個Endpoint在使用同樣的URI地址資訊時,AddressHeader就是非常必要了。

Binding類包含Name,Namespace,BindingElement集合

Binding的Name以及Namespace是服務中繼資料的唯一標識。

BindingElement是WCF通訊時binding的方式。

如:

   SecurityBindingElement:Endpoint使用SOAP訊息安全方式。

   ReliableSessionBindingElement:Endpoint利用可信賴訊息確保訊息的傳送。

   TcpTransportBindingElement:Endpoint利用TCP作為通訊的傳輸協議。

 ContractDescription用於描述WCF的Contracts以及它們的操作operations.

在ContractDescription類中,每個Contract的operation都有相對應的OperationDescription,用於描述operation的類型。

在OperationDescription中還包含了MessageDecription集合用於描述Message.

在WCF編程模型中,ContractDescription通常是在定義Contract的介面或類中建立。

對於這個介面或類類型,標記以ServiceContractAttribute,而其Operation方法則標記以OperationContractAttribute.

*當然我們也可以不利用CLR的Attribute,而採用手工建立。

Contract中還包含了ContractBehavior的集合,ContractBehavior類型可以用於修改或擴充Contract的行為。

關係圖如下: 

ContractDescription

        ---Name

        ---NameSpace

        ---OperationDescription

                          ----MessageDescription

        ---IContractBehavior

其實WCF專門提供了行為Behavior,它可以對用戶端和服務端的一些功能進行修改或擴充。

還有Security behavior用於控制安全與授權

     transaction behavior控制事務

由於WCF需要管理的是服務端與用戶端的通訊。

服務端:WCF提供了類ServiceDescription用於描述一個WCFservice

用戶端:WCF管理的是發送訊息時需要使用到的通訊Channel,類ChannelDescription描述了這樣的用戶端通道。

ServiceDescription

        ----Service Type

        ----IServiceBehavior

        ----ServiceEndpoint

                   ----EndpointAddress

                   ----Binding

                   ----ContractDescription

我們可以利用代碼的方式Create ServiceDescription object, or using WCF's Attribute, or using tool--SvcUtil.exe.

下面我們來一個Hello World,來結束WCF的第一節。 

using System.ServiceModel;

//標記了[ServiceContract],這就使得類成為了一個WCF Service

[ServiceContract]
public class HelloWorld
{

    //標記了[OperationContract],而成為該Service的一個Operation
    [OperationContract]
    public void Hello()
    {
      Console.WriteLine("Hello World!");
    }
}

不過WCF推薦的做法是將介面定義為一個Service,這使得WCF Service更靈活了。

畢竟對於一個介面而言,可以在同時有多個類實現這個介面,這也意味著可以有多個ServiceContract的實現。

以上面代碼可以修改為:

[ServiceContract]
public interface IHello
{  
    [OperationContract]
    void Hello();
}

而類HelloWorld則實現這個IHello interface:
public class HelloWorld:IHello
{
     public void Hello() 
    {
        Console.WriteLine("Hello World!");
     }
}

 

最後一個WCFService必須有host作為它啟動並執行環境。

那麼Host可以是Asp.net,Windows service,普通的應用程式。

下面是Host的代碼:

using System.ServiceModel

public class HostApp

{

     static void Main(string[] args)

     {

        ServiceHost host = new ServiceHost(typeof(HelloWorld),new Uri(http://localhost:8080/HelloService));

        host.AddServiceEndpoint(typeof(IHello),new BasicHttpBinding(),"Svc");

        host.Open();

        Console.WriteLine("Start Your Service.");

        Console.ReadKey();

        host.Close();

     }

}

以上我們建立了一個ServiceHost對象,通過它就可以建立WCF Runtime,WCF Runtime是一組負責接收和發送訊息的對象。

ServiceHost可以建立SerivceDescription對象,利用ServiceDescription,ServiceHost為每一個ServiceEndPoint建立一個EndpointListener.

 

 ServiceHost

       --- ServiceDescription

       --- EndpointListener

*在建立ServiceHost時,傳遞的type型別參數,不能是interface.

所以,我在這裡傳入的是typeof(HelloWorld).

AddServiceEndpoint()方法實現了為Host添加Endpoint的功能.

     其參數正好是Endpoint的三部分(Address,Binding,Contract),

     此時IHello,為ServiceContract,其方法Hello為OperationContract

Open()方法用於建立和開啟Service運行時;

Close()方法來關閉這個運行時。(當然實際上此方法是可以不調用的,因為應用程式結束後,系統會自動Close Host的.)

 

但是,大家都需要養成好的習慣,WCF仍然要求顯式調用Close()方法。

因為Service運行時其本質是利用Channel來完成訊息的傳遞,When open service runtime, using a Channel in System,invoke back, we need release using for channel. so maybe use "using" to manage resource of the ServiceHost release.

 

 嗯,定義好一個WCF Service,並將其運行在host上後,如何?它與用戶端的通訊呢?

 請見下篇:)

 

 

 

 

 

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.