2016-06-01 10 views
0

Ich habe WCF-Dienste von einem Windows-Dienst gehostet. Der Windows-Dienst wartet auf USB-Laufwerke (Ziehen und Stecken. Jetzt habe ich den Client darüber informieren wollen.Windows-Dienst gehostet WCF: Rückruf an Client von Windows-Dienst

Ich habe versucht, eine statische Methode in den WCF-Dienst aus der Windows-Dienst anrufen erste , wo ich das dann nennen Callback-Methode über

OperationContext.Current.GetCallbackChannel<ICallback>() 

Aber OperationContext.Current ist immer null. es scheint, ich bin im falschen Thread/Kontext.

habe dann versucht, ein statisches Ereignis in der WCF-Dienst zu erklären, registriert es in der wcf und rief eine statische Methode aus dem Windows-Dienst in der WCF-Dienst e, die das Ereignis dann auslöst:

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

} 

..still nicht funktioniert. Also, wie kann ich das tun, Informationen aus dem Windows-Dienst an den Client mit den Rückrufen von WCF übergeben.

+2

Sie können nur innerhalb einer Dienstoperation, die ursprünglich ein Clientaufruf für Ihren Dienst war, einen Rückruf ausführen (OperationConnect.Current ist nur nicht null, also innerhalb einer Dienstoperation). Der Ereignishandler 'OnStatusChanged' wird nicht im Kontext einer WCF-Dienstoperation ausgeführt. Haben Sie bereits andere "publish subscribe wcf" Artikel über SO recherchiert? Viele Informationen dort. –

Antwort

0

Okay, was ich jetzt getan habe, ruft eine "InitCallback" -Funktion vom Client und speichern ein ICallBack-Objekt in ein Feld. Wiederverwendung dieses Callback-Objekts vom Windows-Dienst, um vom Windows-Dienst über den wcf-Dienst zum Client kommunizieren zu können.

für den zu arbeiten der wcf-service muss natürlich als singleton laufen. Skalierbarkeit ist keine Sorge..so geht es mir gut.