如何在程序运行期间保持WCF Soap服务打开

时间:2013-03-04 22:01:59

标签: c# wcf

我正在开发一个C#WCF项目,除了相当大但希望简单的问题之外,我已经完成了它的工作。

WCF服务在我的控制台应用程序中托管,我的控制台应用程序将函数调用到另一个类以打开WCF服务的连接。

但是,如果函数的最后一行是host.open();函数调用然后完成连接关闭,服务不能再使用。但是,如果我在host.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方法中调用此函数调用。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分: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