2009-06-25 9 views
39

Ich versuche, WCF zu lernen. Ich habe eine einfache Client- und Server-Anwendung eingerichtet und nach dem Drücken einer Schaltfläche auf dem Client erhält es einen aktualisierten Wert vom Server.Welche Schritte muss ich ergreifen, um WCF-Callbacks zu verwenden?

Mein nächster Schritt ist ich versuche, einen Rückruf vom Server zum Client zu machen, um seinen Wert zu aktualisieren. Ich habe viele Beispiele durchgespielt, und sie scheinen einfach zu groß und verwirrend. Gibt es jemanden, der mir das einfachste Beispiel seiner Implementierung in C# geben kann?

Ich schaue weiter durch Beispiele online und ich verstehe einfach nicht, was es braucht? Natürlich könnte ich das Beispiel Zeile für Zeile kopieren, aber das tut mir nicht gut, weil ich immer noch nicht was zu implementieren, wenn ich das in meinem eigenen Code tun wollte.

Könnte mir jemand bitte mit einem sehr einfachen Beispiel helfen, welche Schritte ich ausführen müsste und was ich im Servercode und dann im Clientcode tun müsste, um dies zu ermöglichen?

Danke

Antwort

75

ist hier über die einfachste komplettes Beispiel, dass ich mit oben kommen kann:

public interface IMyContractCallback 
{ 
    [OperationContract] 
    void OnCallback(); 
} 

[ServiceContract(CallbackContract = typeof(IMyContractCallback))] 
public interface IMyContract 
{ 
    [OperationContract] 
    void DoSomething(); 
} 

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] 
public class MyService : IMyContract 
{ 
    public void DoSomething() 
    { 
     Console.WriteLine("Hi from server!"); 
     var callback = OperationContext.Current.GetCallbackChannel<IMyContractCallback>(); 
     callback.OnCallback(); 
    } 
} 

public class MyContractClient : DuplexClientBase<IMyContract> 
{ 
    public MyContractClient(object callbackInstance, Binding binding, EndpointAddress remoteAddress) 
     : base(callbackInstance, binding, remoteAddress) { } 
} 

public class MyCallbackClient : IMyContractCallback 
{ 
    public void OnCallback() 
    { 
     Console.WriteLine("Hi from client!"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var uri = new Uri("net.tcp://localhost"); 
     var binding = new NetTcpBinding(); 
     var host = new ServiceHost(typeof(MyService), uri); 
     host.AddServiceEndpoint(typeof(IMyContract), binding, ""); 
     host.Open(); 

     var callback = new MyCallbackClient(); 
     var client = new MyContractClient(callback, binding, new EndpointAddress(uri)); 
     var proxy = client.ChannelFactory.CreateChannel(); 
     proxy.DoSomething(); 
     // Printed in console: 
     // Hi from server! 
     // Hi from client! 

     client.Close(); 
     host.Close(); 
    } 
} 

Einige Namespaces müssen, um aufgenommen werden, um das Beispiel auszuführen:

using System; 
using System.ServiceModel; 
using System.ServiceModel.Channels; 
+1

Ich denke immer noch zu hart es ist. Ich werde nach Socket implementieren: P – Seva

+4

Kopieren/Einfügen dieser Lösung funktionierte nicht für mich (VS2010, .NET 4.0). Der Client blockiert das Warten auf die Antwort des Servers und Sie erhalten Timeout-Ausnahmen. Sie müssen [OperationContract (IsOneWay = true)] auf DoSomething setzen. Alternativ können Sie das Threading selbst behandeln oder ConcurrencyMode = Multiple, UseSynchronizationContext = false für MyCallbackClient festlegen. Siehe diese Frage/Antwort: http://stackoverflow.com/a/13091230/2184185 –

+0

Dies ist die einzige hilfreichste Sache, die ich gefunden habe versuchen, Duplex-Kommunikation in WCF zu lernen. –

2

Wenn ich Ihre Frage richtig zu lesen, können Sie ein Zwei-Wege-Gespräch zwischen dem Client und dem Server (der Server an den Client kommunizieren zurück) haben wollen. Die WSDualHttpBinding gibt Ihnen diese Funktionalität.

Die unglückliche Realität mit WCF ist, dass es so etwas wie ein einfaches Beispiel nicht gibt. Dazu müssen Sie Verträge definieren, die Dienste konfigurieren und einen Host verwenden und Client-Code erstellen. Werfen Sie einen Blick auf für ein etwas einfaches Beispiel.

3

Schnappen Sie sich eine Kopie von "Programmierung WCF Services, 2nd Edition" von Juval Lowy. Es gibt große Abschnitte des Buches, die Callback-Operationen gewidmet sind. Beginnen Sie in Kapitel 5 auf Seite 214. Im Kapitel Concurrency Management (Kapitel 8) finden Sie noch mehr Informationen.

"Programmierung WCF Services" ist mehr oder weniger die WCF "Bibel".

2

Ich weiß, alte Frage ... Ich bin heute auf diese Frage von einer Google-Suche gestoßen und die Antwort von Ray Vernagus ist das am einfachsten zu verstehende Beispiel von WCF, das ich bisher gelesen habe. So sehr, dass ich es in VB.NET umschreiben konnte, ohne irgendwelche Online-Konverter zu verwenden. Ich dachte, ich würde die VB.NET-Variante des von Ray Vernagus bereitgestellten Beispiels hinzufügen. Erstellen Sie einfach eine neue VB.NET Windows Console-Anwendung, fügen Sie einen Verweis auf System.ServiceModel hinzu, und kopieren Sie den gesamten folgenden Code in die standardmäßige Module1 Klassendatei.

Imports System.ServiceModel 
Imports System.ServiceModel.Channels 



Public Interface IMyContractCallback 
    <OperationContract()> _ 
    Sub OnCallBack() 
End Interface 

<ServiceContract(CallBackContract:=GetType(IMyContractCallback))> _ 
Public Interface IMyContract 
    <OperationContract()> _ 
    Sub DoSomething() 
End Interface 

<ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Reentrant)> _ 
Public Class Myservice 
    Implements IMyContract 

    Public Sub DoSomething() Implements IMyContract.DoSomething 
     Console.WriteLine("Hi from server!") 
     Dim callback As IMyContractCallback = OperationContext.Current.GetCallbackChannel(Of IMyContractCallback)() 
     callback.OnCallBack() 
    End Sub 
End Class 

Public Class MyContractClient 
    Inherits DuplexClientBase(Of IMyContract) 

    Public Sub New(ByVal callbackinstance As Object, ByVal binding As Binding, ByVal remoteAddress As EndpointAddress) 
     MyBase.New(callbackinstance, binding, remoteAddress) 
    End Sub 
End Class 

Public Class MyCallbackClient 
    Implements IMyContractCallback 

    Public Sub OnCallBack() Implements IMyContractCallback.OnCallBack 
     Console.WriteLine("Hi from client!") 
    End Sub 
End Class 


Module Module1 

    Sub Main() 
     Dim uri As New Uri("net.tcp://localhost") 
     Dim binding As New NetTcpBinding() 
     Dim host As New ServiceHost(GetType(Myservice), uri) 
     host.AddServiceEndpoint(GetType(IMyContract), binding, "") 
     host.Open() 

     Dim callback As New MyCallbackClient() 
     Dim client As New MyContractClient(callback, binding, New EndpointAddress(uri)) 
     Dim proxy As IMyContract = client.ChannelFactory.CreateChannel() 

     proxy.DoSomething() 
     ' Printed in console: 
     ' Hi from server! 
     ' Hi from client! 

     Console.ReadLine() 

     client.Close() 
     host.Close() 
    End Sub 

End Module 
Verwandte Themen