2017-12-18 17 views
0

ユーザー資格情報を持つ別のアプリケーションを起動するローカルSYSTEMとして実行しているサービスがあります。 この2番目のアプリは、コールバックメソッドを使用して受信した文字列を使用してバルーンヒントをユーザーに表示するトレイアイコンです。この2番目のアプリケーションは、デュプレックスモードでWCFに接続します。C#WCFサービスへの接続の待機を強制する方法

私の問題は、何らかの理由でWCFへの接続がメソッドMainの最後に確定されていることです。だから私は最後の行 "kiosk.MyStart(args);に含まれている、実行直後にコールバックメッセージをアプリケーションに送ることはできません。コールバックはまだnullを指しています。

どうすればこの問題を解決できますか?

static void Main(string []args) 
{ 
    if (Environment.UserInteractive) 
    { 
     // Start the WCf service 
     var host = new ServiceHost(typeof(WcfService)); 
     host.Open(); 

     //Launch the Kiosk Agent which connects to the WCF 
     bool ret = ProcessAsUser.Launch("C:\\Program Files (x86)\\KIOSK\\KioskAgent.exe"); 
     WinService kiosk = new WinService(args); 
     // some checks and a welcome message is sent to the user. 
     kiosk.MyStart(args); 

     //... 
     //... 
    } 
} 

編集:kiosk.MyStartメソッドの内部で、より多くのビットを明確にする私はウェルカムメッセージを表示するようにコールバックを実行しようとするところですが、コールバックは、まだNULLです。クライアントが到達できない、それは内にある場合、私は、クライアントが適切に何らかの理由で開始されなかったと仮定し、私は再びそれを起動した結果 ...

  if (WcfService.Callback != null) 
       WcfService.Callback.UIMessageOnCallback(UIMessage); 
      else 
       ProcessAsUser.Launch("C:\\Program Files (x86)\\KIOSK\\KioskAgent.exe"); 
+1

私はあなたが何を求めているのか、WCFがその 'kiosk.MyStart'メソッドに関係しているのか理解できません。あなたが表示するコードは何ですか?それはサービスですか?そして、何かがnullになるのはどこですか?それから何がnullですか? 'args'や' kiosk'?これには本当に[mcve]が必要です。 – rene

+0

GUIアプリケーションを正常に起動するには、Windowsサービスを利用するのは悪い考えです。ログオンしているユーザーがいない場合はどうなりますか?おそらく、ログオン時にWindowsタスクマネージャを_onlyで実行していると考えますか? – MickyD

+0

@rene、nullコールバックを呼び出そうとしたときにKiosk.mystartメソッドの中に入れました。私がその記事に追加したノートを見てください。 – jacortijo

答えて

1

は、コールバックメソッドオーバーのtry catchブロックを追加します。あなたがそれを退会することができるキャッチ。また、キープアライブメッセージをクライアントに送信して、使用可能かどうかを確認することも良い方法です。

private void InformClient(ClientInfo clientInfo) 
{ 
    var subscribers = this._subscriberRepository.GetAll(); 
    foreach (var subscriber in subscribers) 
    { 
     try 
     { 
      if (subscriber.Callback.FireInformClient(clientInfo)); 
      { 
       //If subscriber not reachable, unsubscribe it 
       this._subscriberRepository.Unsubscribe(subscriber.ClientId); 
      } 
     } 
     catch (Exception exception) 
     { 
      //If subscriber not reachable, unsubscribe it 
      this._subscriberRepository.Unsubscribe(subscriber.ClientId); 
      Log.Error(nameof(InformClient), exception); 
     } 
    } 
} 

IClientCallback

public interface IClientCallback 
{ 
    [OperationContract] 
    bool FireInformClient(ClientInfo clientInfo); 
} 

あなたが例えばより多くの加入者の端末を持っている場合、サーバーはすべての加入者を管理するためのsubscriberRepositoryを作成します。

var callback = OperationContext.Current.GetCallbackChannel<IClientCallback>(); 
if (this._subscriberRepository.Subscribe(clientId, callback)) 
{ 
    return true; 
} 
関連する問題