Learn WCF Service basic
WCF是使用託管代碼建立和運行面向服務(Service Oriented)應用程序的統一框架。它使得開發者能夠建立一個跨平臺的、安全、可信賴、事務性的解決方案,且能與已有系統兼容協作。WCF是微軟分佈式應用程序開發的集大成者,它整合了.Net平臺下所有的和分佈式系統有關的技術,例如.Net Remoting、ASMX、WSE和MSMQ。
一些術語解釋:
SOA:面向服務的體系結構(Service-Oriented Architecture,SOA)是一種 IT 體系結構風格,支持將業務轉換爲一組相互鏈接的服務或可重複業務任務,可在需要時通過網絡訪問這些服務和任務。這個網絡可以是本地網絡、Internet,也可以分散於各地且採用不同的技術,比如通過對來自紐約、倫敦和中國香港的服務進行組合,可讓最終用戶感覺似乎這些服務就安裝在本地桌面上一樣。可以對這些服務進行結合,以完成特定的業務任務,從而讓業務快速適應不斷變化的客觀條件和需求。
WSE: WSE(Web Services Enhancements) 是微軟提供的一個實現了WS-Security, WS-Routing, WS-Policy、WS-Addressing, WS-Attachments and DIME 等標準的組件(dll)。是對Web Service的補充與加強。它使得開發人員可以不需要深入瞭解上述協議的具體內容就可以開發相應的Web Services 程序,大大簡化了開發難度,使得Web Services應用在企業級項目上成爲可能。
.NET Remoting: 簡而言之,可以將其看作是一種分佈式處理方式。從微軟的產品角度來看,可以說Remoting就是DCOM的一種升級,它改善了很多功能,並極好的融合到.Net平臺下。Microsoft .NET Remoting 提供了一種允許對象通過應用程序域與另一對象進行交互的框架。它能夠高性能的實現.Net與.Net之間的通信。
MSMQ:MSMQ(Microsoft Message Queue,微軟消息隊列)是在多個不同的應用之間實現相互通信的一種異步傳輸模式,相互通信的應用可以分佈於同一臺機器上,也可以分佈於相連的網絡空間中的任一位置。它的實現原理是:消息的發送者把自己想要發送的信息放入一個容器中(我們稱之爲Message),然後把它保存至一個系統公用空間的消息隊列(Message Queue)中;本地或者是異地的消息接收程序再從該隊列中取出發給它的消息進行處理。
SOAP:簡單對象訪問協議 (SOAP,全稱爲Simple Object Access Protocol) 是一種標準化的通信協議,它主要用於Web服務 (web service) 中。SOAP的出現是爲了簡化網絡服務器 (Web Server) 在從XML數據庫中提取資料時,不用花時間格式化頁面,並且能夠讓不同的應用程序之間通過HTTP協議,以XML格式互相交換彼此的資料,使其與程序語言、平臺和硬件無關。
Enterprise Service(COM+):Enterprise Services可以追溯到發佈爲一個Windows NT 4.0選項包的Microsoft Transaction Server (MTS) 。MTS提供了COM對象的事務處理等服務,擴展了COM。由於MTS擴展COM的方式與COM不兼容,所以從MTS應用程序中調用COM對象需要特定MTS API調用。by [email protected] 林剛
Windows 2000的一個最重要的新特性是在COM+中集成了MTS和COM。在Windows 2000中,COM+基本服務支持COM+服務(以前的MTS服務)需要的環境,例如分佈式事務處理。COM+也新增了一些服務。
COM+ 1.5可以在Windows XP和Windows Server 2003中使用。COM+ 1.5也新增了一些特性,以提高可伸縮性和可用性,包括應用程序池和循環,以及可配置的隔離級別。
.NET Enterprise Services可以在.NET組件中使用COM+服務,併爲Windows 2000及其後續版本提供了支持。在COM+應用程序中運行.NET組件,不需要使用CCW;而是作爲.NET組件運行。在操作系統上安裝.NET運行庫程序,會給COM+服務添加一些擴展。
WCF可以非常簡單的創建一個WebService,下面我們通過一個例子來進行說明。
例子:
第一步: 添加WCF名稱域:
using System.ServiceModel;
using System.ServiceModel.Description;
ServiceModel 是.NET當中用來實現WCF服務功能的名稱域。
第二步: 定義服務。
[ServiceContract()]
public interface IServiceInterface
{
[OperationContract]
string sayHello( string text );
}
public class Service1 : IServiceInterface
{
public string sayHello(string text)
{
return "hello" + text;
}
}
一般來講,將服務定義爲接口,然後由它衍生出多中服務的類。這樣做的一個好處是可以在接口級別定義屬性,而在服務的類的級別看不到任何屬性信息。只需要實現預先定義好的方法就可以。
第三步: 建立宿主,WCF的Service可以運行在程序,Windows 服務或者ASP.NET上面,我們使用Console來建立宿主:
internal class MyServiceHost
{
internal static ServiceHost mySvcHost = null;
internal static void StartService()
{
……
}
internal static void StopService()
{
……
}
}
static void Main(string[] args)
{
MyServiceHost.StartService();
Console.ReadLine();
MyServiceHost.StopService();
Console.Read();
return;
}
這裏,我們定義了一個宿主 MyServiceHost,其中包含一個ServiceHost類的成員,ServiceHost類是ServiceModel當中用來創建通信對象的類。我們可以通過它來創建一個監聽的對象,成爲EndpointListener.
第四步:創建WCF運行時。
internal static void StartService()
{
//首先,創建一個ServiceHost對象,傳入的參數是Service對象的類型和服務的地址。
Uri address = new Uri("http://localhost:8080/service1");
mySvcHost = new ServiceHost( typeof(Service1),address );
//在創建的ServiceHost對象當中查找,看是否存在ServiceMetadataBehaviour的元數據行爲
//描述,如果沒有找到,創建一個新的ServiceMetadataBehaviour對象。
ServiceMetadataBehavior behaviour = mySvcHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (behaviour == null)
behaviour = new ServiceMetadataBehavior();
//設置允許進行HttpGet操作。
behaviour.HttpGetEnabled = true;
//設置MetadataExporter導出Metadata時遵循WS-Policy 1.5規範。
behaviour.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
//將創建好的behaviour加入到宿主實例的行爲描述組當中。
mySvcHost.Description.Behaviors.Add(behaviour);
//加入MetadataExchange endpoint.
mySvcHost.AddServiceEndpoint(
ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex"
);
//加入應用程序 endpoint
WSHttpBinding binding = new WSHttpBinding();
mySvcHost.AddServiceEndpoint(typeof(IServiceInterface), binding, address);
//打開 ServiceHost 實例。
mySvcHost.Open();
}
第五步: 測試:
在瀏覽器當中鍵入http://localhost:8080/service1, 將會看到創建的服務顯示:
第六步:用應用程序客戶端測試WCF服務:
在命令行中敲入svcutil http://localhost:8080/service1?wsdl,
svcutil.exe 會自動生成客戶端ServiceClient對象的代碼,產生兩個文件service1.cs和output.config, 然後在客戶端就可以使用服務客戶端的類進行同WCF service的通信。
class ClientApp
{
static void Main(string[] args)
{
Service1Client client = new Service1Client();
// 使用"client" 變量在服務上調用操作。
Console.WriteLine("請輸入你的名字: ");
string name = Console.ReadLine();
Console.WriteLine(client.SayHello(name));
// 始終關閉客戶端。
client.Close();
Console.ReadLine();
}
}