2010-04-23 7 views
1

서버를 시작할 때 몇 가지 연결을해야합니다. 나는이 클라이언트 - 서버 응용 프로그램에 wcf 기술을 사용하고 있습니다. 문제는 서버의 생성자가 언제든지 호출되지 않기 때문에 잠시 동안 첫 번째 클라이언트가 연결을 만들 때 연결을 초기화한다는 것입니다. 그러나 이것은 문제를 더욱 발생시킵니다.어떻게 시작시 서버를 초기화 할 수 있습니까?

이 내 서버 설정입니다 : 내가 그래서 내가 그것을 초기화 할 수 있습니다 로그온하기 위해 클라이언트를 기다리지 않고 서버를 시작할 수있는 방법

private static ServiceHost _svc; 

    static void Main(string[] args) 
    { 
     NetTcpBinding binding = new NetTcpBinding(SecurityMode.Message); 
     Uri address = new Uri("net.tcp://localhost:8000"); 
     _svc = new ServiceHost(typeof(MonitoringSystemService), address); 
     publishMetaData(_svc, "http://localhost:8001"); 
     _svc.AddServiceEndpoint(typeof(IMonitoringSystemService), binding, "Monitoring Server"); 
     _svc.Open(); 

     Console.WriteLine("Listener service gestart op net.tcp://localhost:8000/Monitoring"); 
     Console.ReadLine(); 
    } 

    private static void publishMetaData(ServiceHost svc, string sEndpointAddress) 
    { 
     ServiceMetadataBehavior smb = svc.Description.Behaviors.Find<ServiceMetadataBehavior>(); 
     if (smb != null) 
     { 
      smb.HttpGetEnabled = true; 
      smb.HttpGetUrl = new Uri(sEndpointAddress); 
     } 
     else 
     { 
      smb = new ServiceMetadataBehavior(); 
      smb.HttpGetEnabled = true; 
      smb.HttpGetUrl = new Uri(sEndpointAddress); 
      svc.Description.Behaviors.Add(smb); 
     } 
    } 

.

미리 감사드립니다.

+0

"서버의 생성자가 언제든지 호출되지 않습니다."... 어떤 생성자에 대해 이야기하고 있습니까? MonitoringSystemService? 프로그램이 시작될 때 Main 메서드가 호출됩니다. 왜 거기에 연결을 초기화하지 않습니까? –

+0

예, MonitoringSystemService의 cunstructor를 의미합니다. MonitoringSystemService에서 연결을 호출해야하며 main 메서드에서 초기화하는 경우 액세스 할 수 없습니다. – Terry

답변

0

WCF는 필요에 따라 MonitoringSystemService 클래스를 인스턴스화합니다. 첫 번째 클라이언트가 연결될 때까지 인스턴스를 생성하지 않으며 한꺼번에 많은 클라이언트 연결을 얻으면 몇 가지 MonitoringSystemServices를 인스턴스화하여 부하를 처리합니다.

이 동작을 사용하지 않고 대신 프로그램 시작시 생성되는 MonitoringSystemService 인스턴스 하나만 사용하면됩니다. 대신 자동으로 인스턴스를해야 입력 WCF 이야기, 당신은 스스로를 인스턴스화하고 그것을 통과 : 확장 성을 희생

_svc = new ServiceHost(new MonitoringSystemService()), address); 

당신은 MonitoringSystemService의 생성자가 실행될 때의 제어를 얻을 수 있습니다.

(확장 성이 필요한 경우) Main 메서드에서 "연결을 초기화"할 수 있지만 WCF는 이러한 연결을 공유해야하는 여러 MonitoringSystemServices를 인스턴스화 할 수 있습니다.

+0

위대한, 내가 무엇을 찾고 있었는지. 하지만 확장 성은 무엇을 의미합니까? 그리고 내가 직접 인스턴스화하는 옵션을 선택하면 MonitoringSystemService의 인스턴스가 여러 개있을 것입니까? – Terry

+0

MonitoringSystemService를 직접 인스턴스화하도록 선택한 경우 프로그램에는 사용자가 만든 하나의 인스턴스 만 있습니다. ServiceHost는 더 이상 생성하지 않습니다. 여러 클라이언트가 동시에 서비스를 호출하면 해당 요청은 WCF에 의해 대기되고 MonitoringSystemService의 단일 인스턴스에 의해 하나씩 처리됩니다. 동시에 많은 클라이언트를 연결하는 경우 속도가 느려질 수 있습니다 (즉, 확장 불가능). 그러나 한 번에 적은 수의 클라이언트 만 연결할 수 있다면 문제가되지 않습니다. instantiate-it-yourself 옵션을 선택하십시오. –

+0

jups, 나는 지금 당장 그것을하고있어 내가 가진 문제를 해결. 클라이언트가 많이 연결되는 경우는 없으므로 문제가되지 않습니다. 감사합니다. – Terry

0

내가 즉시 생각할 수있는 두 가지 방법이 있습니다.

하나 - 당신은 Windows 서비스

과 두 번째로 솔루션을 구현할 수 있습니다 - 더미 클라이언트 프로그램이 시작시 서버를 호출 할 수 있습니다.

+0

developping 단계에서 콘솔 응용 프로그램으로 사용하고 있지만 완벽하게 실행되는 즉시 서비스로 변환하려고합니다. – Terry

+0

그런 경우 시작시 서버를 호출하기 위해 더미 클라이언트를 작성하는 것이 좋습니다. –

관련 문제