2009-07-07 80 views
6

语境:WCF:从服务器访问服务实例

我需要开发一些监控我们的应用程序的监控服务器(这些应用程序在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(); 
     } 
    } 
} 

回答

9

最后,我找到了答案,这是很容易的。我只需要创建服务实例并将引用传递给ServiceHost的构造函数。

所以我需要将以下代码:

using (ServiceHost host = new ServiceHost(typeof(ApplicationRegistrationService), 
       new Uri[]{ new Uri("net.pipe://localhost")})) 

由:

ApplicationRegistrationService myService = new ApplicationRegistrationService(); 

using (ServiceHost host = new ServiceHost(myService, 
       new Uri[]{ new Uri("net.pipe://localhost")})) 
0

如果你的意思是你想你的监控服务,并已注册的服务或节点之间的双向沟通​​,那么你可能需要使用WCF双向通信也被称为全双工通信。非常酷的东西。

http://www.codeproject.com/KB/WCF/WCF_Duplex_UI_Threads.aspx

+0

感谢您的链接,但我已经在我的代码做类似的事情。 – 2009-07-08 03:07:53