2013-03-04 67 views
1

我正在開發一個C#WCF項目,除了相當大但希望簡單的問題外,我已經完成了它的工作。如何保持WCF Soap服務在程序運行期間打開

的WCF服務是從我的控制檯應用程序中託管和我的控制檯應用程序調用一個函數不同的類以打開WCF服務的連接。

但是,如果函數的最後一行是host.open();函數調用然後完成到連接關閉,服務不能再使用。但是,如果我在console.open之後放置Console.ReadLine(),那麼服務將保持打開狀態,我可以使用它,但顯然程序的其餘流程不再運行。

下面是我用來打開主機連接的代碼。

public void startSoapServer() 
     { 
      string methodInfo = classDetails + MethodInfo.GetCurrentMethod().Name; 
      if (String.IsNullOrEmpty(Configuration.soapServerSettings.soapServerUrl) || 
       Configuration.soapServerSettings.soapPort == 0) 
      { 
       string message = "Not starting Soap Server: URL or Port number is not set in config file"; 
       library.logging(methodInfo, message); 
       library.setAlarm(message, CommonTasks.AlarmStatus.Medium, methodInfo); 
       return; 
      } 
      //baseAddress = new Uri(string.Format("{0}:{1}", Configuration.soapServerSettings.soapServerUrl, 
      // Configuration.soapServerSettings.soapPort)); 
      baseAddress = new Uri("http://localhost:6525/hello"); 

      using (ServiceHost host = new ServiceHost(typeof(SoapServer), baseAddress)) 
      { 
       ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
       smb.HttpGetEnabled = true; 
       smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 
       host.Description.Behaviors.Add(smb); 
       host.Opened += new EventHandler(host_Opened); 
       host.Faulted += new EventHandler(host_Faulted); 
       host.Open(); 
       Console.ReadLine(); 
      } 

沒有Console.ReadLine()函數完成,連接關閉。如何讓主機在C#應用程序運行期間保持打開狀態。

這個函數調用是通過在控制檯內啓動一些東西,在Main方法中間調用的。

感謝您提供的任何幫助。

回答

2

你需要在類範圍,而不是函數範圍內聲明的ServiceHost和不使用using

using {}將自動處置其所涉及與處置裝置關閉該對象。此外,由於ServiceHost是在函數範圍內定義的,因此函數完成後將立即超出範圍,並由垃圾收集器清理。

您的ReadLine調用阻止關閉的原因是因爲它位於using語句中,並且在聲明該變量的函數內停止該程序,使其保持在範圍內。

你需要做這樣的事情:

private ServiceHost host; 

public void startSoapServer() 
     { 
      // trimmed... for clarity 


       host = new ServiceHost(typeof(SoapServer), baseAddress)); 

       ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
       smb.HttpGetEnabled = true; 
       smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 
       host.Description.Behaviors.Add(smb); 
       host.Opened += new EventHandler(host_Opened); 
       host.Faulted += new EventHandler(host_Faulted); 
       host.Open(); 

      // etc. 

您將關閉host當您退出應用程序。

+0

現在非常感謝。謝謝你的幫助 – Boardy 2013-03-04 23:47:41