2009-07-07 5 views
6

컨텍스트 : 나는 (이 응용 프로그램은 C#을에) 우리의 일부 응용 프로그램을 감시하는 모니터링 서버를 개발해야WCF : 서버에서 서비스 인스턴스 액세스

. 그래서 저는 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

감사하지만 난 이미 내 코드에서 비슷한 일을한다. –