2017-12-18 4 views
0

Ich habe einen Dienst als lokale SYSTEM ausgeführt, die eine andere Anwendung mit den Benutzeranmeldeinformationen startet. Diese zweite App ist nur ein Taskleistensymbol, das dem Benutzer Sprechblasen mit der Zeichenfolge anzeigt, die mit der Callback-Methode empfangen wurde. Diese zweite Anwendung wird im Duplexmodus mit der WCF verbunden.C# Wie erzwinge ich die Wartezeit für die Verbindung zu einem WCF-Dienst

Mein Problem ist, dass aus irgendeinem Grund die Verbindung zum WCF am Ende der Methode Main abgeschlossen ist. Daher kann ich direkt nach der Ausführung keine Callback-Nachricht an die App senden, die in der letzten Zeile "kiosk.MyStart (args);" enthalten ist. dort zeigt der Callback immer noch auf null.

Irgendeine Idee, wie ich dieses Problem lösen könnte?

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); 

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

bearbeiten: ein bisschen mehr zu klären, innerhalb kiosk.MyStart Methode ist, wo ich versuche, den Rückruf auszuführen eine Willkommensnachricht zu zeigen, aber der Rückruf ist immer noch NULL. Als Ergebnis Ich gehe davon aus, dass der Client nicht richtig aus irgendeinem Grunde gestartet wurde und ich es starte wieder ...

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

Ich verstehe nicht, was Sie fragen, noch wo WCF in dieser 'kiosk.MyStart' Methode beteiligt ist. Was ist der Code, den du zeigst? Ist das der Service? Und woher kommt das, dass etwas null ist? Und was ist dann null? 'args' oder' kiosk'? Das braucht wirklich [mcve]. – rene

+0

Es ist eine schlechte Idee, sich auf einen Windows-Dienst zu verlassen, um eine GUI-App erfolgreich zu starten. Was passiert, wenn kein Benutzer angemeldet ist? Betrachten Sie den Windows Task-Manager möglicherweise mit einer Only-Run-On-On-Only-Einschränkung? – MickyD

+0

@rene, das null Ich habe es in der Kiosk.mystart-Methode, wenn ich versuche, den Rückruf zu rufen. Siehe die Notiz, die ich dem Beitrag hinzugefügt habe. – jacortijo

Antwort

1

einen Versuch catch-Block über die Callback-Methode hinzufügen, wenn der Kunde nicht erreichbar fällt in Den Haken kannst du abbestellen. Ist auch eine gute Übung, senden Sie eine Keepalive-Nachricht an Ihren Client, um zu überprüfen, ob es verfügbar ist.

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); 
} 

Wenn Sie mehr Abonnenten zum Beispiel ein Terminal haben, Server eine subscriberRepository erstellen alle Abonnenten zu verwalten.

var callback = OperationContext.Current.GetCallbackChannel<IClientCallback>(); 
if (this._subscriberRepository.Subscribe(clientId, callback)) 
{ 
    return true; 
} 
Verwandte Themen