上下文
我需要开发一个监视服务器来监视我们的一些应用程序(这些应用程序在c#中)。所以我决定使用WCF开发系统,这似乎适合我的需求。
这些应用程序在启动时必须将自己注册到监视服务器。之后,监视服务器可以调用这些应用程序的Start或Stop方法。
一切都在同一台机器上完全执行,无需远程执行任何操作。
所以我开发了一个很好的原型,一切正常。每个应用程序将自己注册到监视服务器。
问题:
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();
}
}
}
答案 0 :(得分:9)
最后,我找到答案,这很容易。我只需要创建服务实例并将引用传递给ServiceHost的构造函数。
所以我需要替换以下代码:
using (ServiceHost host = new ServiceHost(typeof(ApplicationRegistrationService),
new Uri[]{ new Uri("net.pipe://localhost")}))
by:
ApplicationRegistrationService myService = new ApplicationRegistrationService();
using (ServiceHost host = new ServiceHost(myService,
new Uri[]{ new Uri("net.pipe://localhost")}))
答案 1 :(得分:0)
如果您的意思是您希望监控服务与注册的服务或节点之间进行双向通信,那么您可能应该在WCF中使用双向通信,也称为双工通信。很酷的东西。
http://www.codeproject.com/KB/WCF/WCF_Duplex_UI_Threads.aspx