通過了解了WCF的一些基本概念并創建和編寫WCF應用中的相應方法,實現了WCF服務和客戶端之間的調用,就能夠理解WCF應用是如何進行通信的。了解了一些基本的WCF概念后,還需要深入了解WCF消息的概念。
18.4.1 消息傳遞
客戶端與服務器之間是通過消息進行信息通信的,通過使用消息,客戶端和服務器之間能夠通過使用消息交換來實現方法的調用和數據傳遞。
1.Request/Reply消息傳遞模式
Request/Reply模式是默認的消息傳遞模式,該模式調用服務器的方法后需要等待服務的消息返回,從而獲取服務器返回的值。Request/Reply模式是默認模式,在聲明時無需添加其模式的聲明,示例代碼如下所示。
string GetShopInformation(string address);//默認模式
上述代碼就使用了一個默認的Request/Reply模式進行消息傳遞,GetShopInformation方法同樣需要實現,示例代碼如下所示。
{
if (address == "武漢")//判斷地址
{
return "武漢麥當勞連鎖店";//返回相應結果
}
else if (address == "北京")//判斷地址
{
return "北京麥當勞連鎖店";//返回相應結果
}
else if (address == "上海")//判斷地址
{
return "上海麥當勞連鎖店";//返回相應結果
}
else
{
return "沒有該連鎖店";//返回默認結果
}
}
GetShopInformation方法返回一個string的值給客戶端,客戶端調用服務器的方法時,首先會向服務器發送消息,以告訴服務器客戶端需要調用一個方法,當服務器接收消息后會返回消息給客戶端。在這一段過程中,客戶端會等待服務器端的相應,當客戶端接受到服務器的相應后,則會呈現在客戶端應用程序中。如圖18-12所示。
圖18-12 Request/Reply模式
2.One-way消息傳遞模式
One-way模式和Request/Reply模式不同的是,如果使用One-way模式定義一個方法,該方法被調用后會立即返回。使用One-way模式修飾的方法必須是void方法,如果該方法不是void修飾的方法或者包括out/ref等參數,則不能使用One-way模式進行修飾,示例代碼如下所示。
void OutputString();//定義方法
該方法使用了One-way模式,則不能有參數的輸出,只允許void關鍵字修飾該方法,OutpuString方法的具體實現如下所示。
{
Console.WriteLine("IsOneWay=true");
}
運行WCF應用后,執行OutpuString方法后結果如圖18-13所示。
圖18-13 One-way模式
WCF的消息傳遞模式不僅包括這兩種模式,還包括duplex模式,duplex是WCF消息傳遞中比較復雜的一種模式,由于篇幅限制,本書不再進行詳細的介紹。
18.4.2 消息操作
由于WCF的客戶端和服務器之間都是通過消息響應和通信的,那么在WCF應用的運行過程中,消息是如何在程序之間進行操作的,這就需要通過XML文檔來獲取相應的結果。在客戶端和服務器之間出現信息通信,并且客戶端調用了服務器的方法時,就會產生消息,如GetSum方法。GetSum方法在接口中的代碼如下所示。
int GetSum(DateTime time);//定義方法
在GetSum方法的實現過程中,只需要進行簡單的操作即可,示例代碼如下所示。
{
int BreadNum = 10;//聲明必要字段
int Milk = 5; //聲明必要字段
int HotDryNuddle = 20;//聲明必要字段
int today = BreadNum + Milk + HotDryNuddle;//實現計算
return today; //返回值
}
上述代碼執行后,客戶端會調用服務器的GetSum方法,服務器接受響應再返回給客戶端相應的值,如圖18-14和圖18-15所示。
圖18-14 執行服務器方法
圖18-15 返回的XML格式文檔
在運行后,測試客戶端能夠獲取請求時和響應時的XML文檔,其中請求時產生的XML文檔如下所示。
從上述代碼可以看到在Action節中,使用了相應的方法GetSum,在WCF服務庫編程中可以通過使用OperationContract.Action捕獲相應的Action消息,示例代碼如下所示。
Message MyProcessMessage(Message m);
MyProcessMessage實現示例代碼如下所示。
{
CompositeType t = m.GetBody<CompositeType>();//獲取消息
Console.WriteLine(t.StringValue);//輸出消息
return Message.CreateMessage(MessageVersion.Soap11,
"Add", new CompositeType("Hello World!"));//返回消息
}
上述代碼將操作轉換為消息后發送,開發人員可以通過Windows應用程序或ASP.NET應用程序獲取修改后消息的內容。在進行消息的操作時,WCF還允許開發人員使用 MessageContractAttribute / MessageHeaderAttribute 來控制消息格式,這比 DataContractAttribute 要更加靈活。
文章列表