我需要开发一些监控我们的应用程序的监控服务器(这些应用程序在C#)。所以我决定用WCF开发这个系统,这看起来适合我的需要。
这些应用程序在启动时必须注册到监视服务器。之后,监控服务器可以调用这些应用程序的启动或停止方法。
一切都完全在同一台机器上执行,没有什么需要远程执行。
所以我开发了一个很好的原型,一切正常。每个应用程序都将自己注册到监控服务器
问:
ApplicationRegistrationService
(见下面的代码)是监控服务的实现,它是一个单独的实例由于ServiceBehavior
属性。
这里我的问题:我想访问每个例子的ApplicationRegistrationService
的内容,从我的服务器连接的应用程序的数量(例如ConsoleMonitoringServer
)。但是,我不知道如何实现这一点。
是否需要在我的服务器中创建一个像我在客户端(ConsoleClient
)那样的服务的通道,或者存在更好的方法来实现此目的?
代码:
该代码是非常简化为这个问题的目的:
//The callback contract interface
public interface IApplicationAction
{
[OperationContract(IsOneWay = true)]
void Stop();
[OperationContract(IsOneWay = true)]
void Start();
}
[ServiceContract(SessionMode = SessionMode.Required,
CallbackContract = typeof(IApplicationAction))]
public interface IApplicationRegistration
{
[OperationContract]
void Register(Guid guid, string name);
[OperationContract]
void Unregister(Guid guid);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class ApplicationRegistrationService : IApplicationRegistration
{
//IApplicationRegistration Implementation
}
public class ApplicationAction : IApplicationAction
{
//IApplicationAction Implementation
}
对于这个例子
class ConsoleClient
{
static void Main(string[] args)
{
ApplicationAction actions = new ApplicationAction();
DuplexChannelFactory<IApplicationRegistration> appRegPipeFactory =
new DuplexChannelFactory<IApplicationRegistration>(actions,
new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/AppReg"));
IApplicationRegistration proxy = appRegPipeFactory.CreateChannel();
proxy.Register(Guid.Empty, "ThisClientName");
//Do stuffs
}
}
控制台服务器该控制台应用程序示例
class ConsoleMonitoringServer
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(ApplicationRegistrationService),
new Uri[]{ new Uri("net.pipe://localhost")}))
{
host.AddServiceEndpoint(typeof(IApplicationRegistration),
new NetNamedPipeBinding(), "AppReg");
host.Open();
//Wait until some write something in the console
Console.ReadLine();
host.Close();
}
}
}
感谢您的链接,但我已经在我的代码做类似的事情。 – 2009-07-08 03:07:53