快捷搜索:

用WCF实现对无人终端的远程监控

最进在项目中,碰到了一个必要在远程监视自动运行软件的实时环境的例子。由于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]

///

/// 远程发送节制敕令

///

///

void Operation();

[OperationContract]

///

/// 更新状态

///

void UpdateStatus();

}

public interface ISeviceCallBack

{

void ReceiveStatus();

void ReceiveCommand();

}

public static class Global

{

public static List callBacks = new List();

}

[ServiceBehavior]

public class Service : IService,IDisposable

{

ISeviceCallBack callBack;

#region IService Members

public Service()

{

callBack = System.ServiceModel.OperationContext.Current.GetCallbackChannel();

Global.callBacks.Add(callBack);

}

///

/// 当办事端调用这个时,向终端发敕令

///

public void Operation()

{

foreach (var r in Global.callBacks)

{

r.ReceiveCommand();

}

}

///

/// 当终端调用时,向办事端发敕令

///

public void UpdateStatus()

{

foreach (var r in Global.callBacks)

{

r.ReceiveStatus();

}

}

#endregion

#region IDisposable Members

public void Dispose()

{

Global.callBacks.Remove(this.callBack);

}

#endregion

}

}

这样做实现起来对照方便,然则毛病也是很显着的,由于实际上终端只必要调用updateStatus,并回调receiveCommand,而治理端只必要调用Operation,回调receiveUpdateStatus(),现在这两种操作同时裸露给了终端和治理端 ,是以从设计上,这是一种不安然设计。。而且在调用响应的操作时,办事端自己又回获得响应的callBack,让人认为很费解。

那么下一步的设法主见,显然是把面向终端和治理真个办事进行分开。同时,用全局的变量或MSMQ进行交互,这里为了简单起见,只应用了Listnamespace Geyunfei.WCF2

{

///

/// 面向终真个办事

///

[ServiceContract(

SessionMode = SessionMode.Required

,

CallbackContract = typeof(ITerminalSeviceCallBack )

)]

public interface ITerminalService

{

[OperationContract]

///

/// 更新状态

///

void UpdateStatus();

}

///

/// 面向治理真个办事

///

[ServiceContract(

SessionMode = SessionMode.Required

,

CallbackContract = typeof(IControlSeviceCallBack)

)]

public interface IControlService

{

[OperationContract]

///

/// 远程发送节制敕令

///

///

void Operation();

}

public interface ITerminalSeviceCallBack

{

void ReceiveCommand();

}

public interface IControlSeviceCallBack

{

void ReceiveStatus();

}

public static class Global

{

public static List controlcallBacks = new List();

public static List terminalcallBacks = new List();

}

[ServiceBehavior]

public class TerminalService : ITerminalService, IDisposable

{

ITerminalSeviceCallBack callBack;

#region IService Members

public TerminalService()

{

callBack = System.ServiceModel.OperationContext.Current.GetCallbackChannel();

Global.terminalcallBacks .Add(callBack);

}

///

/// 当终端调用时,向办事端发敕令

///

public void UpdateStatus()

{

foreach (var r in Global.controlcallBacks)

{

r.ReceiveStatus();

}

}

#endregion

#region IDisposable Members

public void Dispose()

{

Global.terminalcallBacks .Remove(this.callBack);

}

#endregion

}

[ServiceBehavior]

public class ControlService : IControlService, IDisposable

{

IControlSeviceCallBack  callBack;

#region IService Members

public ControlService()

{

callBack = System.ServiceModel.OperationContext.Current.GetCallbackChannel();

Global.controlcallBacks .Add(callBack);

}

///

/// 当办事端调用这个时,向终端发敕令

///

public void Operation()

{

foreach (var r in Global.terminalcallBacks)

{

r.ReceiveCommand();

}

}

#endregion

#region IDisposable Members

public void Dispose()

{

Global.controlcallBacks .Remove(this.callBack);

}

#endregion

}

}

您可能还会对下面的文章感兴趣: