C# WCF:从服务器访问服务实例
上下文: 我需要开发一个监控服务器来监控我们的一些应用程序(这些应用程序是c#)。因此,我决定用WCF开发适合我需要的系统 这些应用程序在启动时必须向监控服务器注册。之后,监控服务器可以调用这些应用程序的启动或停止方法 所有操作都完全在同一台机器上执行,不需要远程执行任何操作 所以我开发了一个很好的原型,一切都很好。每个应用程序都将自己注册到监控服务器 问题:C# WCF:从服务器访问服务实例,c#,wcf,client-server,C#,Wcf,Client Server,上下文: 我需要开发一个监控服务器来监控我们的一些应用程序(这些应用程序是c#)。因此,我决定用WCF开发适合我需要的系统 这些应用程序在启动时必须向监控服务器注册。之后,监控服务器可以调用这些应用程序的启动或停止方法 所有操作都完全在同一台机器上执行,不需要远程执行任何操作 所以我开发了一个很好的原型,一切都很好。每个应用程序都将自己注册到监控服务器 问题: ApplicationRegistrationService(参见下面的代码)是监控服务的实现,由于ServiceBehavior属性,
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();
}
}
}
如果您的意思是希望在监视服务和注册的服务或节点之间进行双向通信,那么您可能应该在WCF中使用双向通信,也称为双工通信。很酷的东西
最后,我找到了答案,答案很简单。我只需要创建服务实例并将引用传递给ServiceHost的构造函数 因此,我需要替换以下代码:
using (ServiceHost host = new ServiceHost(typeof(ApplicationRegistrationService),
new Uri[]{ new Uri("net.pipe://localhost")}))
作者:
谢谢你的链接,但我已经在代码中做了类似的事情。仅供参考:这只适用于InstanceContextMode=InstanceContextMode.Single的情况。
ApplicationRegistrationService myService = new ApplicationRegistrationService();
using (ServiceHost host = new ServiceHost(myService,
new Uri[]{ new Uri("net.pipe://localhost")}))