最近在项目中,遇到了一个需要在远程监视自动运行软件的实时情况的例子。因为MS面向服务方面有 WCF,而且看了一些资料,觉得WCF比较适合这个应用。因此决定用WCF来实现这个功能。
首先,先说一下具体的应用,监控,顾名思义,有两个方面的意思,一方面是”监”,也就是远程要 能实时查看终端的各种情况。这里其实指的就是被监控的要能主动的,实时的向远程控制端发送自己的情 况。另一方面是控,即远程端能够发布命令控制终端进行执行。并由终端返回一定的执行信息。
而且这里是一种一对一对多的关系,即一个终端可以被多个管理端监控。实际上一个管理端也可以监 控多个终端,在是这种分析中,我们可以明白,真正运行服务的是终端,而不是管理端。
简单起见,假定远程发送命令的操作是void Operation(),终端更新的操作是UpdateStatus();
这个想法,从设计到实现,经历以下三种阶段的变形。
最初的想法,是一个Service类。一个接口。即
即控制端调用operation发送命令,终端调用UpdateStatus更新状态。
对应的,要有一定的回调,即控制端发送Operation时,终端要有一个callBack进行接收,相应的,当 终端用UpdateStatus时,控制端也要有一个callBack进行接收。
当这两种操作被集成到一个服务中时,我们的wcf接口变成了如下结构。
namespace Geyunfei.WCF
{
[ServiceContract(
SessionMode = SessionMode.Required
,
CallbackContract = typeof(ISeviceCallBack)
)]
public interface IService
{
[OperationContract]
/// <summary>
/// 远程发送控制命令
/// </summary>
///
void Operation();
[OperationContract]
/// <summary>
/// 更新状态
/// </summary>
void UpdateStatus();
}
public interface ISeviceCallBack
{
void ReceiveStatus();
void ReceiveCommand();
}
public static class Global
{
public static List<ISeviceCallBack> callBacks = new List<ISeviceCallBack>();
}
[ServiceBehavior]
public class Service : IService,IDisposable
{
ISeviceCallBack callBack;
#region IService Members
public Service()
{
callBack = System.ServiceModel.OperationContext.Current.GetCallbackChannel<ISeviceCallBack> ();
Global.callBacks.Add(callBack);
}
/// <summary>
/// 当服务端调用这个时,向终端发命令
/// </summary>
public void Operation()
{
foreach (var r in Global.callBacks)
{
r.ReceiveCommand();
}
}
/// <summary>
/// 当终端调用时,向服务端发命令
/// </summary>
public void UpdateStatus()
{
foreach (var r in Global.callBacks)
{
r.ReceiveStatus();
}
}
#endregion
#region IDisposable Members
public void Dispose()
{
Global.callBacks.Remove(this.callBack);
}
#endregion
}
}