04 WCF通信模式
WCF的通信模式有三种
【1】请求响应模式:
只能是客户端调用服务器;
客户端请求并等待服务器的响应后才继续执行后续操作(异步调用除外)
【2】单工模式:
只能是客户端调用服务器。
服务器端不响应响应
【3】双工模式:
客户端和服务器能相互调用,
客户端得实现一个接口的类用于服务端调用。
客户端不用等待服务端响应就可以继续执行后续操作;
服务端自动调用在客户端中的接口实现类的方法。
请求响应模式
默认就是请求响应模式,特点是客户端必须等待服务器端的响应后才能继续进行下一步的操作。
实现方式:
第一步:服务接口
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetRequesAndReponseModeMessage();
服务实现类
public class Service1 : IService1
{
private string warmMsg = "我在服务器这边休息了5秒,你还在等吗?"; public string GetRequesAndReponseModeMessage()
{
System.Threading.Thread.Sleep();
return "请求响应模式消息" + warmMsg;
}
第二步:客户端调用:
IService1 responseService = new Service1Client();
responseService.GetRequesAndReponseModeMessage();
单工模式
单工模式的特点是:
方法必须是void,参数类型不能是out,ref
实现方式:
在服务接口类的方法上面添加[OperationContract(IsOneWay = true)]
实现步骤:
第一步:服务接口
[ServiceContract]
public interface IService1
{
[OperationContract(IsOneWay = true)]
void GetSingleModeMessage(); //[OperationContract(IsOneWay = true)]单工模式不能有返回值,参数列表中不能有out ref关键字
服务实现类
public class Service1 : IService1
{
public void GetSingleModeMessage()
{
System.Threading.Thread.Sleep();
}
第二步:客户端调用
IService1 responseService = new Service1Client();
responseService.GetSingleModeMessage();
双工模式
客户端和服务器能相互调用,
客户端得实现一个接口的类用于服务端调用。
客户端不用等待服务端响应就可以继续执行后续操作;
服务端自动调用在客户端中的接口实现类的方法。
实现步骤:
第一步:服务接口类:
WCF服务端需要定义两个接口,
第一个是在WCF服务端实现该接口(例如:IService1),
第二个是在客户端实现该接口(例如:IServerDuplexCallBack)
这两个接口是通过在第一个接口(IService1)上使用如下特性进行关联的,
[ServiceContract(
SessionMode = SessionMode.Required
, CallbackContract = typeof(IServerDuplexCallBack))]
而第二个接口不用声明任何特性,
并且,两个接口的双工方法必须都是使用单工形式(即:方法声明为[OperationContract(IsOneWay = true)])
代码如下:
IService1.cs
[ServiceContract(
SessionMode = SessionMode.Required
, CallbackContract = typeof(IServerDuplexCallBack))]
public interface IService1
{
[OperationContract(IsOneWay = true)]
void GetDuplxMModeMessage1();
IServerDuplexCallBack.cs
/// <summary>
/// 双工模式,服务端调用客户端接口,不需要指定ServiceContract特性
/// </summary>
interface IServerDuplexCallBack
{
[OperationContract(IsOneWay = true)]
void ReturnDuplexMessage(string message);
}
第二步:服务端的实现第一个接口IService1
服务端的实现第一个接口IService1的实现类需要使用如下特性:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] //双工模式需要设置
并且声明一个第二接口(IServerDuplexCallBack)变量(如:callBack)指向客户端实现第二个接口(IServerDuplexCallBack)的实现类实例,并通过
IServerDuplexCallBack callBack
{
get
{
return OperationContext.Current.GetCallbackChannel<IServerDuplexCallBack>();
}
}
来获取实例。
Service1.cs
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] //双工模式需要设置
public class Service1 : IService1
{ IServerDuplexCallBack callBack
{
get
{
return OperationContext.Current.GetCallbackChannel<IServerDuplexCallBack>();
}
} public void GetDuplxMModeMessage1()
{
System.Threading.Thread.Sleep();
callBack.ReturnDuplexMessage("调用GetDuplxMModeMessage1 返回的 双工模式消息"); }
第三步:客户端
【1】在客户端实现第二个接口(IService1Callback)的实现类(ServerDuplexCallBack)
ServerDuplexCallBack.cs
namespace Keasy5.WCF.RAndR.Client
{
public class ServerDuplexCallBack:ServiceReference1.IService1Callback
{
public void ReturnDuplexMessage(string message)
{
MessageBox.Show(message);
}
}
}
【2】在客户端调用服务端:
InstanceContext instanceContext = new InstanceContext(new ServerDuplexCallBack());
IService1 service1 = new Service1Client(instanceContext); service1.GetDuplxMModeMessage1();
得声明一个第二个接口的实现类实例new ServerDuplexCallBack(),用于生成InstanceContext类实例,
用于构造服务代理类IService1 service1 = new Service1Client(instanceContext);
客户端不用等待服务端响应就可以继续执行后续操作,到时服务端自动调用第二个接口的实现类实例new ServerDuplexCallBack()的方法
public void ReturnDuplexMessage(string message)
{
MessageBox.Show(message);
}
【The end】