新建一个Windows窗体应用程序(即客户端Client)和一个WCF服务库(WCF双工)
在WCF双工项目下:
新建一歌ILogger接口和实现该接口的Logger类
在ILogger接口中
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace WCF双工
{
/// <summary>
/// 1 将接口标记成一个双工通讯接口
/// CallbackContract:回调的接口
/// </summary>
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IResult))]
public interface ILogger
{
/// <summary>
/// 3 此方法也必须是一个数据报的方法
/// </summary>
/// <param name="logtxt"></param>
[OperationContract(IsOneWay = true)]
void WriteLog(string logtxt);
}
/// <summary>
/// 2 接口的名称可以由程序员自行定义
/// </summary>
public interface IResult
{
/// <summary>
/// 2.1 特点:此方法必须是一个数据报的方法
/// </summary>
/// <param name="msg"></param>
[OperationContract(IsOneWay = true)]
void WriteResult(string msg);
}
}
需要注意:将接口标记为一个双工通讯接口,即添加[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IResult))]
其中IResult接口是为了实现双工通讯,该接口下的方法需要将特性设置为数据报的方法
Logger类中
using System.Diagnostics;
using System.ServiceModel;
namespace WCF双工
{
public class Logger : ILogger
{
IResult iresult;
/// <summary>
/// 4.0 构造函数中接收在客户端实现了IResult的子类的对象实例
/// </summary>
public Logger()
{
//获取了客户端的IResult的具体实现类的对象实例
//OperationContext当前执行方法的上下文
//GetCallbackChannel执行当前回调的管道
iresult = OperationContext.Current.GetCallbackChannel<IResult>();
}
//给客户端的调用的方法,需要等待休眠时间结束才返回,但线程不被影响
{
//1.0 接收到数据以后需要5秒钟才能处理完成
Stopwatch stop = new Stopwatch();
stop.Start();
System.Threading.Thread.Sleep(5000);
stop.Stop();
//2.0 通过回调客户端的函数将处理结果响应给客户端
iresult.WriteResult("您的请求已经处理成功,耗时" + stop.Elapsed.Seconds + "秒钟");
}
}
}
注意:Logger构造函数接收在客户端实现了IResult的子类的对象实例,调用当前操作的客户端实例的管道
修改配置文件
在Client中
添加对WCF服务的引用
先启动WCF服务,在启动Client程序,结果视图如下