WCF的三种模式
Posted zhuyapeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WCF的三种模式相关的知识,希望对你有一定的参考价值。
WCF通信的3种模式
1.正常模式:客户端调取接口-》等待服务响应-》接受响应-》执行客户端后面代码(wcf服务有入参,有返回值)
2.数据报模式:客户端调取接口-》不等待响应,直接执行客户端后面代码(wcf服务有入参,无返回值)
3.双工模式:客户端调取接口-》服务端立刻回复介绍到请求-》服务端继续执行,客户端也继续执行-》服务端执行回调客户端回调函数,传递信息给客户端(wcf服务有入参,无返回值,但必须定义客户端回调函数)
上代码:
接口代码
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WCFServerLib { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。 [ServiceContract] public interface IService1 { /* 标记当前方法是一个请求响应方式 * 请求数据,客户端等待相应结果,再去执行下面代码 */ [OperationContract] string GetData(int value); /* 标记当前方法是一个数据报方法 * 请求数据过去,但不响应结果,客户端不用等待 */ [OperationContract(IsOneWay=true)] void WriteLog(string msg); } }
实现代码
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WCFServerLib { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。 public class Service1 : IService1 { public string GetData(int value) { System.Threading.Thread.Sleep(5000); return string.Format("接收到消息: {0}", value); } public void WriteLog(string msg) { System.Threading.Thread.Sleep(5000); } } }
客户端调用代码
private void button2_Click(object sender, EventArgs e) { //正常调用 Client.ServiceReference1.Service1Client ss = new ServiceReference1.Service1Client(); MessageBox.Show("调用前"); string str= ss.GetData(121); MessageBox.Show(str); } private void button3_Click(object sender, EventArgs e) { //数据报 Client.ServiceReference1.Service1Client ss = new ServiceReference1.Service1Client(); MessageBox.Show("调用前"); ss.WriteLog("123"); MessageBox.Show("调用后"); }
双工通信方式
服务端代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; namespace WCFServerLib { //定义双工通信:通信模型1.立即会返回数据。2.处理完成会再次返回数据,通过设定好的回调函数。 [ServiceContract(SessionMode=SessionMode.Required,CallbackContract=typeof(IResult))] public interface IDuplex { //IsOneWay=true:双工通信 //双工通信不能有返回值 [OperationContract(IsOneWay=true)] void Run(string msg); } /// <summary> /// 定义一个回调契约,供客户端实现它 /// </summary> public interface IResult { [OperationContract(IsOneWay=true)] void Reuslt(string msg); } public class Duplex : IDuplex { IResult result; public Duplex() { //从方法的操作上下文中获取到客户端传递过来的IResult这个接口的实现类对象 result = OperationContext.Current.GetCallbackChannel<IResult>(); } public void Run(string msg) { //模拟5秒钟以后处理完成 System.Threading.Thread.Sleep(5000); result.Reuslt("处理完成"+msg); } } }
客户端代码
private void button1_Click(object sender, EventArgs e) { System.ServiceModel.InstanceContext ic = new InstanceContext(new CallBacks()); DuplexClient c = new DuplexClient(ic); c.Run("--1--");//立即返回处理数据 MessageBox.Show("双工通信出来完毕"); } } public class CallBacks : IDuplexCallback { /// <summary> /// 双工通信回调方法 /// </summary> /// <param name="msg"></param> public void Reuslt(string msg) { MessageBox.Show(msg); } }
以上是关于WCF的三种模式的主要内容,如果未能解决你的问题,请参考以下文章