2013-03-04 30 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