目的用于測試WCF服務
準備工作兩項。
(一)WCF服務
這部分包含WCF服務及其宿主,用于運作WCF服務。這部分建立立控制台應用程式。
(二)通路WCF服務的用戶端
這部分用于測試申請WCF服務
這裡簡化所有操作。這個示例不僅提供用于測試WCF服務的測試結構,且實作三種消息交換方式
One-Way Calls
Request/Reply
Duplex
(一)One-Way方式實作
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IServiceShowMsg
{
[OperationContract(IsOneWay=true)]
void SingleMsg(string str);
}
public class ServiceSHowMsg : IServiceShowMsg
#region IServiceShowMsg 成員
public void SingleMsg(string str)
{
Console.Write("單工 "+str);
}
#endregion
在控制台程式中添加WCF服務。
這個是oneway實作:在方法SingleMsg中添加協定(契約Contract)IsOneWay=true
它
·沒有傳回值,傳回類型隻能為void
·不能包含ref或者out類型的參數
·隻有用戶端發起請求,服務端并不會對請求進行回複
(二)控制台Main
static void Main(string[] args)
{
Uri baseAddress = new Uri("http://localhost:9876/WCFConsole/ServiceSHowMsg");
ServiceHost selfHost = new ServiceHost(typeof(ServiceSHowMsg), baseAddress);
selfHost.AddServiceEndpoint(typeof(IServiceShowMsg),
new WSHttpBinding(), "ServiceSHowMsg");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
selfHost.Description.Behaviors.Add(smb);
selfHost.Open();
Console.WriteLine("WCF服務準備好了……");
Console.WriteLine("回車退出.");
Console.WriteLine();
Console.ReadLine();
selfHost.Close();
可以看到WCF服務頁,這說明服務運作正常。
(三)用戶端
用戶端申請WCF服務,和WS感覺有很大的相似性。這裡建立測試類庫
有兩種方式:
(1)WS中通過wsdl指令生成代理類,在WCF中以svcutil來生成。
(2)以UI添加服務的方式添加,用戶端(測試類庫)添加web引用(vs05)對WS調用,添加服務引用(vs08)對WCF調用。
建立立類庫,這個建立的類庫這次不要和上邊那個控制台在同一個項目(為了測試)。
建立好類庫測試項目後,還要添加System.ServiceModel引用
現在添加對WCF服務代理,以第(2)種方式實作。右鍵類庫—》添加服務引用
取名為:WcfInstance
測試:
[Test]
public void Test2()
WcfInstance.ServiceShowMsgClient client = new UNTest.WcfInstance.ServiceShowMsgClient();
client.SingleMsg("用戶端請求");
輸出結果:用戶端(測試類庫),無列印資訊;服務端(控制台)列印資訊:單工用戶端請求
Oneway 測試完成。
當WCF服務有變動時,要及時更新代理:在生成的代理類上右鍵—》更新服務引用
(四)R/R方式實作(預設的方式)
WCF的IserviceShowMsg接口中添加方法:
[OperationContract]
string PrintMessage(string strMsg);
并實作:
public string PrintMessage(string strMsg)
Console.WriteLine(strMsg);
return strMsg;
它帶有傳回值
·調用服務方法後需要等待服務的消息傳回,即便該方法傳回 void 類型
·相比Duplex來講,這種模式強調的是用戶端的被動接受,也就是說用戶端接受到響應後,消息交換就結束了。
·在這種模式下,服務端永遠是服務端,用戶端就是用戶端,職責分明。
·它是預設的消息交換模式
(五)控制台不變,用戶端
先更新服務引用
public void Test1()
WcfInstance.ServiceShowMsgClient client = new UNTest.WcfInstance.ServiceShowMsgClient();
Console.WriteLine(client.PrintMessage("這是資訊内容!"));
輸出結果:用戶端(測試類庫),這是資訊内容!;服務端(控制台)列印資訊:這是資訊内容!
(六)Duplex
在服務端建立WCF服務IserviceDuplexShowMsg,并添加CallBack回調方法接口,代碼為:
[ServiceContract]
public interface ICallBack
[OperationContract]
void Done();
}
[ServiceContract(CallbackContract = typeof(ICallBack))]
public interface IServiceDuplexShowMsg
string DoMsg(string str);
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)]
public class ServiceDuplexShowMsg : IServiceDuplexShowMsg
#region IServiceDuplexShowMsg 成員
public string DoMsg(string str)
ICallBack callback = OperationContext.Current.GetCallbackChannel<ICallBack>();
Console.WriteLine("得到消息:"+str);
callback.Done();
return "成功";
·消息交換過程中,服務端和用戶端角色會發生調換
·服務端處理完請求後,傳回給用戶端的不是reply,而是callback請求。
(七)控制台Main修改
Uri baseAddress = new Uri("http://localhost:9876/WCFConsole/ServiceDuplexShowMsg");
ServiceHost selfHost = new ServiceHost(typeof(ServiceDuplexShowMsg), baseAddress);
selfHost.AddServiceEndpoint(typeof(IServiceDuplexShowMsg),new WSDualHttpBinding(),
"ServiceDuplexShowMsg");
(八)啟動控制台測試服務
啟動控制台,浏覽位址:http://localhost:9876/WCFConsole/ServiceDuplexShowMsg是否正常
(九)用戶端
用戶端工作2個,
一是與以前一樣,新添加服務引用,取名:WCFDuplexInstance
二是實作回調方法。
這裡給出實作方法,要實作IcallBack接口,這個接口是代理類中IcallBack接口
public class MyCallback : WCFDuplexInstance.IServiceDuplexShowMsgCallback
#region IServiceDuplexShowMsgCallback 成員
void UNTest.WCFDuplexInstance.IServiceDuplexShowMsgCallback.Done()
{
Console.WriteLine("伺服器消息傳回");
(十)用戶端測試
public void Test3()
MyCallback callback = new MyCallback();
WCFDuplexInstance.ServiceDuplexShowMsgClient client =
new UNTest.WCFDuplexInstance.ServiceDuplexShowMsgClient(
new System.ServiceModel.InstanceContext(callback));
string result = client.DoMsg("duplex job");
測試結果:
服務端:
得到消息 duplex job
用戶端:
伺服器消息傳回
成功
部落格園大道至簡
<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>
轉載請注明:部落格園