熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

一起學WCF--消息通信模式

2013-11-13 09:57:46  來源: .NET編程 

  這一節大家共同研究下WCF消息的通信模式大體上來說WCF共有中通信模式

  請求答復模式

  單程模式

  雙工模式

  接下來我們一一研究

  

   請求答復模式

  請求答復模式是我們最常見和最常用的模式WCF通信默認就采用的這種模式這種模式就是客戶端向服務器端發送消息後需要等待服務器端執行完成並返回結果

  客戶端才能繼續向下執行

  服務器代碼

  [ServiceContract]

  public interface IService

  {

  [OperationContract]

  string GetData(int value)

  [OperationContract]

  CompositeType GetDataUsingDataContract(CompositeType composite)

  // TODO: 在此添加您的服務操作

  }

  public class Service : IService

  {

  public string GetData(int value)

  {

  SystemThreadingThreadSleep(

  return stringFormat(You entered: {} value)

  }

  }

  客戶端

  private void button_Click(object sender EventArgs e)

  {

  //請求響應模式

  //等待服務器端執行完畢客戶端才繼續向下執行

  SingleServiceServiceClient client = new SingleServiceServiceClient()

  string result = clientGetData(

  MessageBoxShow(result)

  }

   單程模式

  單程模式是客戶端向服務器端發送消息後並不需要等待服務器端執行完成和返回結果客戶端就可以繼續向下執行

  使用單程模式的時候要把操作契約的屬性isoneway設為true [OperationContract(IsOneWay=true)]

  單程模式的操作契約的返回值都為void單程契約的方法參數中不能使用refout標記

  服務器端契約

  [OperationContract(IsOneWay=true)]

  void SingleGetData(string name)

  客戶端

  private void button_Click(object sender EventArgs e)

  {

  //單程模型

  //不用等待服務器端直接直接向下執行

  SingleServiceServiceClient client = new SingleServiceServiceClient()

  clientSingleGetData(hello

  MessageBoxShow(hello world

  }

  雙工模式

  雙工模式就是客戶端可以向服務器端發送信息服務器端也可以向客戶端發送信息可以理解為客戶端可以調用服務器端的方法服務器端也可以

  調用客戶端的方法雙工模式要在契約中聲明回調契約服務器端通過回調契約調用客戶端方法聲明回調契約用CallBackContract

  雙工模式實際上可以分為單程雙工模式和請求答復雙工模式

   單程雙工模式

  服務器端契約

  [ServiceContract(CallbackContract = typeof(ICallBackDuplService))]

  public interface IDuplService

  {

  [OperationContract]

  void DoWork()

  [OperationContract(IsOneWay=true)]

  void GetDuplData(string data)

  }

  public interface ICallBackDuplService

  {

  [OperationContract(IsOneWay=true)]

  void ShowMsg(string msg)

  }

  public class DuplService : IDuplService

  {

  public void DoWork()

  {

  }

  #region IDuplService 成員

  public void GetDuplData(string data)

  {

  string str=歡迎使用雙工 + data;

  //獲取當前操作的上下文

  ICallBackDuplService callback = OperationContextCurrentGetCallbackChannel<ICallBackDuplService>()

  callbackShowMsg(str)

  }

  }

  客戶端代碼

  private void button_Click(object sender EventArgs e)

  {

  InstanceContext instanceContext = new InstanceContext(new CallBackDuplService())

  DuplServiceDuplServiceClient client = new DuplServiceDuplServiceClient(instanceContext)

  clientGetDuplData(Hello world

  }

  public class CallBackDuplService:DuplServiceIDuplServiceCallback

  {

  #region IDuplServiceCallback 成員

  public void ShowMsg(string msg)

  {

  //顯示數據

  SystemWindowsFormsMessageBoxShow(msg)

  }

  #endregion

  }

  請求答復雙工模式

  服務器端契約

  [ServiceContract(CallbackContract = typeof(ICallBackDuplService))]

  public interface IDuplService

  {

  [OperationContract]

  void DoWork()

  [OperationContract(IsOneWay = true)]

  void HelloDupl(string name)

  }

  public interface ICallBackDuplService

  {

  [OperationContract]

  void ConsoleMsg(string msg)

  }

  [ServiceBehavior(ConcurrencyMode = ConcurrencyModeReentrant)]

  public class DuplService : IDuplService

  {

  #region IDuplService 成員

  public void HelloDupl(string name)

  {

  string str = 雙工通信模式+name;

  ICallBackDuplService callback = OperationContextCurrentGetCallbackChannel<ICallBackDuplService>()

  callbackConsoleMsg(str)

  }

  #endregion

  }

  客戶端

  private void button_Click(object sender EventArgs e)

  {

  InstanceContext instanceContext = new InstanceContext(new CallBackDuplService())

  DuplServiceDuplServiceClient client = new DuplServiceDuplServiceClient(instanceContext)

  clientHelloDupl(請求答復

  }

  public class CallBackDuplService:DuplServiceIDuplServiceCallback

  {

  #region IDuplServiceCallback 成員

  public void ShowMsg(string msg)

  {

  //顯示數據

  SystemWindowsFormsMessageBoxShow(msg)

  }

  #endregion

  #region IDuplServiceCallback 成員

  public void ConsoleMsg(string msg)

  {

  SystemWindowsFormsMessageBoxShow(msg)

  }

  #endregion

  }


From:http://tw.wingwit.com/Article/program/net/201311/12127.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.