这一节大家共同研究下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 } |