2011-08-30 11 views
5

私のWCFサービス開始直後に何かしたい。どのようにそれを行うことができますか?私のWCFサービス開始時に何かをする

実際、10分ごとにサービスの一部の変数を更新する必要があります。だから私はスレッドに私の更新コードを入れました。しかし、サービスが開始されたときにこのスレッドをどのように開始するのか分かりません(WCFサービスでForm_Loadイベントが好きですか?)

+1

どのようにwcfサービスをホストしていますか? – Jan

答えて

2

サーバ上でスレッドを実行するのは難しいです。最後のセッションが終了すると、アプリケーションはシャットダウンします。一部のホスティングプロバイダは、スレッドを実行し続けるチャンスを奪うスケジュールでアプリケーションプールもリサイクルします。

これ以外にも、WCFサービスは実際には実行されません。リクエストによってトリガーされたWebページのように動作します。 initコードを追加するには、Application_StartGlobal.asaxが入ります。これは、アプリケーションが起動すると(最初の要求が行われたとき)一度呼び出されます。

サービスのリクエストごとに何かを行う場合は、Application_BeginRequestイベントもGlobal.asaxに接続することができます。

+0

'Global.asax'? ;) – Marc

+0

@Marc:P - fixed – TheCodeKing

+0

Windowsサービスまたは自己ホストアプリケーションでWCFをホストするとどうなりますか?そこにはglobal.asaxはなく、その意味ではWebアプリケーションとして動作しません。 Plus WCFはセッションをまったく使用しないことがあります。 – oleksii

5

WCFサービスには、通常、何かをする準備ができているメモリに「まっすぐ」ある部分はありません.... WCFはではありません ASP.NET!

IISでホストしているデフォルトの設定はこれです:

  • IISは、要求のための特定のポート/ URLでリッスン - メモリ内のどこにでもあなたのWCFサービスの単一のトレースがありません

  • 最初の要求が到着すると、IISはServiceHost - サービスを "ホスト"できるクラスをスピンアップします。

  • このサービスホストは、要求が来て、ターゲットURLによって異なりますどのサービスクラスがこの要求を処理するためにインスタンス化するか。サービスクラス(あなたのサービスの実装)が、その後に作成され、そのサービスクラスの適切なメソッドが呼び出されて実行され、そしてそれが終わると、サービスクラスは

だから基本的に、あなたの二点がある配置されています。あなたはそれはあなたがあなたのサービスクラスメトのそれぞれにいくつかの「初期化」のコードを追加することができます

  • をインスタンス化しますときに何かを行います独自のカスタムServiceHostクラスを作成することができ

    1. :にフックすることができます

  • +1

    他のタイプのホスティングはどうですか?これはIIS固有のものです。たとえば、Windowsサービスのホスティングでは、OPはタイマーを作成し、それを行うためにティックイベントを使用することができます。 – oleksii

    +0

    @oleksii:自分でホストしている場合は、もう少しコントロールできます。でも、基本的にはあなたのコントロール下でインスタンス化されるサービスホストを調整するか、サービスメソッドで何かをするときは、 –

    +0

    誰かが「ただぶら下がっている」何かを記憶に残しておきたいのですか? – AjaxLeung

    0

    ニーズを処理するためのdsがあなたのサービスの開始時にコンストラクタを呼び出すインスタンス化サービスを、作成することができます。このサービス上のGetData()を呼び出す

    [ServiceContract] 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
    public class InstanceService 
    { 
        private int _intValue; 
    
        public InstanceService() 
        { 
         _intValue = 456; 
        } 
    
        [OperationContract] 
        public int GetData() 
        { 
         return _intValue; 
        } 
    } 
    

    はと整数を返します。 456の値。

    +3

    このようなシングルトンサービスのインスタンスには、1)リクエストをシリアライズし、順番に処理することにより、潜在的に大きなボトルネックを引き起こすか、2)完全にマルチスレッド対応のプログラミングが必要です。エラーを起こしやすい。可能であればシングルトンを避けるようにしようと思います。 –

    +0

    あなたは正しいです、これは非常に特定の状況においてのみ有用であると言及するのを忘れていました。 – CodeCaster

    0

    これは、これをホストする方法を制御できる場合に達成できます。できる場合は、WCFサービスをWindowsサービスまたはアドホック実行可能ファイルとしてホストします。そして、あなたが望むものを簡単に達成することができます。IISホスティングにバインドされている場合は、他の人が提案し、要求ごとに処理するようにする必要があります。

    IISが必要ない場合は、自己ホスティングwcfを参照してください。

    関連する問題