2010-04-23 38 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方法在程序啓動時被調用,爲什麼不初始化那裏的連接? – 2010-04-23 10:34:08

+0

是的,我的意思是MonitoringSystemService的cunstructor。 我需要在MonitoringSystemService中調用連接,如果我從主方法初始化,則無法訪問它。 – Terry 2010-04-23 11:38:55

回答

0

WCF將根據需要實例化您的MonitoringSystemService類。在第一個客戶端建立連接之前,它不會實例化它,並且如果您一次獲得大量客戶端連接,它將實例化幾個MonitoringSystemServices來處理負載。

您可以禁用此行爲,而只需使用在程序啓動時創建的MonitoringSystemService實例。不是告訴WCF哪種類型應該是自動初始化的,你只要實例化它自己,並傳遞它:

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

您獲得MonitoringSystemService構造器運行時的控制,在可擴展性爲代價的。您可以在Main方法中「初始化連接」,但要注意WCF可以實例化多個需要共享這些連接的MonitoringSystemServices。

+0

太棒了,我在找什麼。 但是,可擴展性是什麼意思? 如果我選擇自己實例化的選項,是否還會有多個MonitoringSystemService實例? – Terry 2010-04-23 11:37:13

+0

如果您選擇自己實例化MonitoringSystemService,那麼您的程序將只創建一個您創建的實例。 ServiceHost不會再創建。如果多個客戶端同時調用您的服務,則他們的請求將由WCF排隊,並由您的MonitoringSystemService的單個實例逐個處理。如果您有很多客戶端在同一時間連接(換句話說,它不可擴展),這可能會很慢。但是,如果您一次只能連接少量的客戶端,那麼這不是一個問題 - 只需要實例化自己的選項。 – 2010-04-23 13:15:44

+0

果汁,我現在正在做,它解決了我的問題。 將不會有很多客戶將連接,所以對我來說不是問題:) 謝謝。 – Terry 2010-04-23 13:33:23

0

我可以立即想到兩種方法。

一個 - 你可以實現你的解決方案作爲Windows服務

和二 - 讓一個虛擬的客戶端程序中調用您在啓動服務器。

+0

在開發階段,我使用它作爲控制檯應用程序,但是我打算在它完美運行後立即將其轉換爲服務。 – Terry 2010-04-23 10:28:49

+0

在這種情況下,我建議你在啓動時編寫一個虛擬客戶端來調用你的服務器。 – 2010-04-23 10:57:25

相關問題