2016-06-01 5 views
0

Windowsサービスがホストするwcfサービスがあります。 Windowsサービスは、USBドライブ(取り外しと挿入を待機します。 今、私はそれについてクライアントに通知します。WindowsサービスのホストWCF:Windowsサービスからのクライアントへのコールバック

私はその後、呼び出すWindowsサービス最初 からWCFサービスの静的メソッドを呼び出そうとしていますコールバックメソッドを経由して

OperationContext.Current.GetCallbackChannel<ICallback>() 

しかしOperationContext.Currentは常にnullである私が間違っているスレッド/コンテキストにいるよようです。

は、WCFでそれを登録し、その後、WCFサービスで静的なイベントを宣言しようとしましたwcf servicのWindowsサービスから静的メソッドを呼び出したイベントが発生した場合:

//WCF Service 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class WCFService : IService 
{ 

    public static event EventHandler<EventArgs> StatusChanged; 

    public Service() 
    { 
     StatusChanged += OnStatusChanged; 
    } 

    private void OnStatusChanged(object sender, EventArgs eventArgs) 
    { 
     // still not in the correct thread here? 
     // OperationContext.Current is null 

     OperationContext.Current.GetCallbackChannel<ILocalLicenceBackendServiceCallback>().ServiceStateChanged(); 
    } 

    public static void ChangeStatus() 
    { 
     if (StatusChanged != null) 
      StatusChanged(null,EventArgs.Empty); 
    } 
} 


//Windows Service 
public partial class WindowsService : ServiceBase 
{ 


    private void OnStatusChanged() 
    { 
     WCFService.ChangeStatus(); 
    } 

} 

..まだ動作していません。それでは、Windowsサービスからクライアントにwcfコールバックを使って情報を渡すには、どうすればいいのでしょうか。

+2

サービスへのクライアント呼び出しであったサービス操作( 'OperationContext.Current'はnullではなく、サービス操作内でのみ)内でのみコールバックできます。あなたの 'OnStatusChanged'イベントハンドラは、WCFサービス操作のコンテキストでは実行されません。すでに他の "publish subscribe wcf"の記事を調べていますか?そこにはたくさんの情報があります。 –

答えて

0

さて、私は今、クライアントから "InitCallback"関数を呼び出し、ICallBackオブジェクトをフィールドに保存しています。 Windowsサービスからそのコールバックオブジェクトを再利用して、Windowsサービスからwcfサービスを介してクライアントに戻すことができます。

wcfサービスを動作させるには、もちろんsingeltonとして実行する必要があります。スケーラビリティは問題ではありません。だから私は大丈夫です。

関連する問題