2017-12-06 3 views
0

Ich habe eine Lösung, die als Dienst ausgeführt wird und kommuniziert mit einer anderen Anwendung über WCF. Im Grunde habe ich Dienstbibliothek WCF und den Dienstvertrag als „CallbackContract“ definierenC# - So rufen Sie WCF-Callback-Anrufe von außerhalb des Dienstes

[ServiceContract(CallbackContract = typeof(IKioskWcfCallback))] 
public interface IKioskWcfService 
{ 
    [OperationContract] 
    void OpenSession(); 
} 

public interface IKioskWcfCallback 
{ 

    [OperationContract] 
    void OnCallback(); 
} 

ich den WCF-Dienst aus dem Hauptprojekt starten Sie die Klasse Servicehost

 Wcfservice = new ServiceHost(typeof(KioskWcf.KioskWcfService)); 
     Wcfservice.Open(); 

Aus dem Inneren des WCF Web-Service, den ich mit kann den Rückruf ohne Problem aufrufen. Ich speichere die Rückrufreferenz, wenn der Client eine Verbindung herstellt, und rufe diesen Rückruf später auf.

public class KioskWcfService : IKioskWcfService 
{ 
    public static IKioskWcfCallback Callback; 
    public static Timer Timer; 

    public void OpenSession() 
    { 
     Console.WriteLine("> Session opened at {0}", DateTime.Now); 
     Callback = OperationContext.Current.GetCallbackChannel<IKioskWcfCallback>(); 

     Timer = new Timer(3000); 
     Timer.Elapsed += OnTimerElapsed; 
     Timer.Enabled = true; 
    } 
    void OnTimerElapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     Callback.OnCallback(); 
    } 

Nun würde Ich mag den Rückruf in einem anderen Teil meines Projektes aufrufen, aber ich weiß nicht, wie den Rückruf des angeschlossenen Client zu verweisen.

Ich sah in einigen Antworten, dass eine Methode GetClients() existiert, aber in meinem Fall bietet VS 2015 diese Methode nicht an.

Hier mein App.cfg

 <service name="KioskWcf.KioskWcfService"> 
    <endpoint address="" binding="wsDualHttpBinding" contract="KioskWcf.IKioskWcfService"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8090/KioskWcf/KioskWcfService/" /> 
     </baseAddresses> 
    </host> 
    </service> 

Vielen Dank.

Antwort

0

Ich möchte den Rückruf in einem anderen Teil meines Projektes

Was Sie tun, ist, kann aufgerufen werden, in der Client-Anwendung oder wo auch immer Sie diesen Rückruf anrufen möchten, dann haben Sie um die Callback-Schnittstelle in der Client-Anwendung zu implementieren.

Angenommen MyClient Anwendung ist der Client oder andere Projekt, in dem Sie die IKioskWcfCallback zu konsumieren oder rufen, dann

class MyClient :KioskNamespace.IKioskWcfCallback 
{ 
    //control is returned from callback to here. 
    public void OnCallback() 
    { 

    } 
} 
Verwandte Themen