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上後,如何?它與用戶端的通訊呢?
請見下篇:)