1

私は 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# アプリが実行されている間、ホストを開いたままにしておくにはどうすればよいですか。

この関数呼び出しは、コンソール内のいくつかのものを初期化する途中で Main メソッド内から呼び出されます。

ご協力いただきありがとうございます。

4

1 に答える 1

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ます。

于 2013-03-04T22:04:16.373 に答える