第一种呢,就是“双工模式”了
如果终结点绑定类型是“wsHttpBinding”就要改下啦, 改成“wsDualHttpBinding”, 还有就是
服务行为别忘了哦: [ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)]
来来来 (~o ̄▽ ̄)~o 添加个服务先
1 public void Register(string name, string pass) 2 { 3 ICallBackContract callBack = OperationContext.Current.GetCallbackChannel<ICallBackContract>(); 4 if (name.Length < 6 || pass.Length < 6) 5 { 6 callBack.Reply("1"); 7 } 8 else 9 { 10 callBack.Reply("0"); 11 } 12 }
come on,首先跟普通的服务约定一样,要先定义一个回调模板。不过呢,不需要实现,因为实现是客户端的事
1 namespace ServiceLib.CallBackContract 2 { 3 [ServiceContract] 4 public interface ICallBackContract 5 { 6 [OperationContract] 7 void Reply(String message); 8 } 9 }
然后呢,就是客户端实现这个接口咯
1 namespace Client.ClientCalcBack 2 { 3 class MyCallBack:ICalcServiceCallback 4 { 5 public void Reply(string msg) 6 { 7 if (msg == "0") 8 Console.WriteLine("注册成功"); 9 else if (msg == "1") 10 Console.WriteLine("注册失败,用户信息不符合要求"); 11 else 12 Console.WriteLine("错误信息:" + msg); 13 } 14 } 15 }
最后就是消费这个服务了
1 InstanceContext callBack = new InstanceContext(new MyCallBack()); 2 CalcServiceClient service = new CalcServiceClient(callBack, "WSDualHttpBinding_ICalcService"); 3 String name, pass; 4 Console.WriteLine("Please input name:"); 5 name = Console.ReadLine(); 6 Console.WriteLine("Please input pass:"); 7 pass = Console.ReadLine(); 8 service.Register(name, pass);
(-。-;) 这个算不算异步呢?
第二种 客户端异步调用
我用的是VS2013社区版,然后呢,它默认生成异步方法(基于任务的操作)
直接使用就可以啦
1 var t = service.WelComeAsync(name); 2 t.ContinueWith(task => Console.WriteLine(task.Result));
参考链接:基于通道什么的
至于另外一种异步和服务端异步处理等想起来再补上吧 (●ˇ∀ˇ●)