天天看點

WCF——消息格式(一)

目的用于測試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>

轉載請注明:部落格園

繼續閱讀