Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在程序运行期间保持WCFSOAP服务打开_C#_Wcf - Fatal编程技术网

C# 如何在程序运行期间保持WCFSOAP服务打开

C# 如何在程序运行期间保持WCFSOAP服务打开,c#,wcf,C#,Wcf,我正在从事一个C#WCF项目,除了一个相当大但希望很简单的问题外,我的工作非常顺利 WCF服务是从我的控制台应用程序中托管的,我的控制台应用程序调用一个函数到另一个类来打开WCF服务的连接 但是,如果函数的最后一行是host.open();然后,函数调用结束,连接关闭,服务无法再使用。但是,如果我将Console.ReadLine()放在host.open之后,那么服务将保持打开状态,我可以使用它,但显然程序的其余部分不再运行 下面是我用来打开主机连接的代码 public void startS

我正在从事一个C#WCF项目,除了一个相当大但希望很简单的问题外,我的工作非常顺利

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

但是,如果函数的最后一行是host.open();然后,函数调用结束,连接关闭,服务无法再使用。但是,如果我将Console.ReadLine()放在host.open之后,那么服务将保持打开状态,我可以使用它,但显然程序的其余部分不再运行

下面是我用来打开主机连接的代码

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#is应用程序运行期间保持主机打开

这个函数调用是在初始化控制台中的某些东西的中途从Main方法中调用的


谢谢你能提供的帮助

您需要在类作用域而不是函数作用域中声明ServiceHost,并且不要使用
来使用

使用{}
将自动处置它所属的对象,处置意味着关闭。此外,由于您的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.

退出应用程序时,您将关闭主机。

非常感谢。谢谢你的帮助