1

Windows サービス内で単純な WCF サービスをホストしています。WCF サービス自体は、インストルメンテーション データを記録する TextWriterTraceListener を作成します。

奇妙なことは、Windows サービスが再起動していないにもかかわらず、新しいログ ファイルを作成し続けているようで、同じログ エントリを複数のファイルに書き込んでいることです。

上記の動作は、基本的にクライアントがサービスに接続するたびに、 MyService のコンストラクターが複数回起動されている場合にのみ発生する可能性があります。私の理解と希望は、MyServiceBase のインスタンスを 1 つだけ作成し、したがって MyService のインスタンスを 1 つだけ作成することです (Windows サービスが開始されるたびに)。

もちろん、これを回避して、Trace に追加されたリスナーの数を確認することはできますが、何が起こっているのかを理解したいと思っています。

コードは次のとおりです。

var ServicesToRun = new ServiceBase[] 
            { 
                new MyServiceBase() 
            };
        ServiceBase.Run(ServicesToRun);

public partial class MyServiceBase : ServiceBase
{
    ServiceHost _serviceHost;

    public MyServiceBase()
    {
        InitializeComponent();
    }


    protected override void OnStart(string[] args)
    {
        _serviceHost = new ServiceHost(typeof(MyService));            
        _serviceHost.Open();

    }

    protected override void OnStop()
    {
        if (_serviceHost != null)
        {
            _serviceHost.Close();
        }
        _serviceHost = null;
    }        
}

 public MyService()
    {         
        _fileListner = new TextWriterTraceListener(string.Format(@"{0}\Trace{1}.log", logDir, DateTime.Now.Ticks));
        Trace.Listeners.Add(_fileListner);
        WriteTraceMessage(string.Format("Service started {0}", DateTime.Now), new Guid("71961817-CB62-410f-AB44-43BFCE246847"));
    }
4

3 に答える 3

3

のインスタンスが作成される方法とタイミングは、 (の一部である)MyServiceなどの WCF 機能によって制御されます。InstanceContextModeServiceBehaviourAttribute

プロパティを使用してInstanceContextMode、新しいサービス オブジェクトがいつ作成されるかを指定します。サービス オブジェクトは通信チャネルに直接接続されていないため、サービス オブジェクトの有効期間は、クライアントとサービス アプリケーション間のチャネルの有効期間とは無関係です。既定値 はPerSession、クライアントとサービス アプリケーションの間で新しい通信セッションが確立されたときに、新しいサービス オブジェクトを作成するようにサービス アプリケーションに指示します。同じセッション内の後続の呼び出しは、同じオブジェクトによって処理されます。

Sessions, Instancing and Concurrencyにも読み物があります。


私の理解と希望は、それがのインスタンスを1つだけ作成しMyServiceBase、したがってのインスタンスを1つだけ作成することですMyService

ただし、OnStartメソッドでは新しいオブジェクトを作成していないことに注意してください。ホストは WCF 属性 (または構成) を使用して有効期間を決定するため、を にMyService渡しています。ServiceHost

于 2013-10-22T06:53:04.437 に答える