컨텍스트 : 나는 (이 응용 프로그램은 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();
}
}
}
감사하지만 난 이미 내 코드에서 비슷한 일을한다. –