2

WCF サービス ライブラリを作成しました。次に、この WCF サービスをホストする Windows サービスを作成しました。今、同じウィンドウ サービス内で WCF サービス ライブラリで定義された関数を呼び出したいと思います。

    protected override void OnStart(string[] args)
    {
        if (serviceHost != null)
            serviceHost.Close();

        // Create a ServiceHost for the Registration type and 
        // provide the base address.
        serviceHost = new System.ServiceModel.ServiceHost(typeof(Registration));

        // Open the ServiceHostBase to create listeners and start 
        // listening for messages.
        serviceHost.Open();

        Registration r = new Registration();

        System.Threading.Thread t = new System.Threading.Thread(r.ReadAttempt);
        Object passParameterToCallback = null;
        t.IsBackground = false;
        t.Start(passParameterToCallback);
    }
4

2 に答える 2

2

同じクラスでメソッドを呼び出す必要がある場合は、 を作成してnew Registration()そのメソッドを呼び出すだけで、コード内で既にそれを行っています。WCF を介して呼び出す理由はありません。

なんらかの理由で WCF を介して自分自身にサービスを呼び出したい場合は、実際のクラスではなくクライアントを構築する必要があります。

WCF サービス オブジェクトの同じインスタンスを呼び出す必要がある場合は、WCF サービスをSingleに設定してから、WCF クライアントを呼び出す必要があります。

または、このコンストラクターを使用ServiceHostしてシングルトン オブジェクトを受け取り、同じオブジェクト インスタンスでメソッドを呼び出すか、ServiceHost.SingletonInstanceプロパティを使用して、コンストラクターに渡されたインスタンスを取得します。

于 2012-08-26T19:06:24.120 に答える
1

これによると、ServiceHostクラスは、タイプの代わりにサービスのシングルトンインスタンスを取り込むこともできるはずです: http://msdn.microsoft.com/en-us/library/ms585487.aspx

そのため、Registration 型のクラスをインスタンス化して、それを ServiceHost に渡します。これは、私が言ったように、シングルトン タイプの WCF サービス、またはより具体的には InstanceContextMode を Single に設定したサービスでのみ機能します。

そうすれば、クラスへの参照が残され、問題なくアクセスできるはずです。

ただし、すべて別の方法で考える価値があるかもしれません。問題が WCF サービスで起こっていることを Windows サービスに通知するだけの場合、WCF サービス内でイベントを定義して、Windows サービスがサブスクライブし、WCF サービスからイベントを受信できるようにする方法はありますか?

WCF サービス内で使用する必要があるロジックの場合は、そのロジックを外部クラスに抽出するか、静的にして、どこでも使用できるようにします。

幸運を

于 2012-08-26T18:57:14.607 に答える