OperationContext.GetCallbackChannel<T> Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ruft einen Kanal zur Clientinstanz ab, die den aktuellen Vorgang aufgerufen hat.
public:
generic <typename T>
T GetCallbackChannel();
public T GetCallbackChannel<T>();
member this.GetCallbackChannel : unit -> 'T
Public Function GetCallbackChannel(Of T) () As T
Typparameter
- T
Der Typ des Kanals, der zum Zurückrufen an den Client verwendet wird.
Gibt zurück
Ein Kanal zur Clientinstanz, die den Vorgang des in der Eigenschaft angegebenen Typs aufgerufen hat CallbackContract .
Beispiele
Im folgenden Codebeispiel wird die Current Eigenschaft und GetCallbackChannel Methode verwendet, um einen Kanal zurück zum Aufrufer innerhalb eines Vorgangs zu erstellen. Alle Vorgänge in diesem Beispiel sind unidirektionale Vorgänge, wodurch der Dienst und der Client unabhängig voneinander kommunizieren können. In diesem Fall erwartet die Beispielclientanwendung nur einen Rückgabeaufruf, bevor er beendet wird, aber ein anderer Client, z. B. ein Windows Forms-Client, kann eine beliebige Anzahl von Anrufen vom Dienst empfangen.
using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(
Name = "SampleDuplexHello",
Namespace = "http://microsoft.wcf.documentation",
CallbackContract = typeof(IHelloCallbackContract),
SessionMode = SessionMode.Required
)]
public interface IDuplexHello
{
[OperationContract(IsOneWay = true)]
void Hello(string greeting);
}
public interface IHelloCallbackContract
{
[OperationContract(IsOneWay = true)]
void Reply(string responseToGreeting);
}
public class DuplexHello : IDuplexHello
{
public DuplexHello()
{
Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
}
~DuplexHello()
{
Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
}
public void Hello(string greeting)
{
Console.WriteLine("Caller sent: " + greeting);
Console.WriteLine("Session ID: " + OperationContext.Current.SessionId);
Console.WriteLine("Waiting two seconds before returning call.");
// Put a slight delay to demonstrate asynchronous behavior on client.
Thread.Sleep(2000);
IHelloCallbackContract callerProxy
= OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
string response = "Service object " + this.GetHashCode().ToString() + " received: " + greeting;
Console.WriteLine("Sending back: " + response);
callerProxy.Reply(response);
}
}
}
Der folgende Client implementiert den SampleDuplexHelloCallback Empfang der Rückrufnachricht. Der importierte Rückrufvertrag ist aufgrund der Verwendung der Name Eigenschaft im vorherigen Beispiel nicht derselbe Name wie der im Dienst enthaltene. Beachten Sie, dass der Client keine Annahmen darüber vorgibt, ob oder wann er einen Rückruf erhält; Der Serverrückruf ist vollständig unabhängig vom ausgehenden Anruf des Clients.
Note
Ein Beispiel, das die OperationContext Klasse in einem Clientszenario verwendet, finden Sie unter OperationContextScope.
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Threading;
namespace Microsoft.WCF.Documentation
{
public class Client : SampleDuplexHelloCallback
{
AutoResetEvent waitHandle;
public Client()
{
waitHandle = new AutoResetEvent(false);
}
public void Run()
{
// Picks up configuration from the config file.
SampleDuplexHelloClient wcfClient
= new SampleDuplexHelloClient(new InstanceContext(this));
try
{
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Enter a greeting to send and press ENTER: ");
Console.Write(">>> ");
Console.ForegroundColor = ConsoleColor.Green;
string greeting = Console.ReadLine();
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Called service with: \r\n\t" + greeting);
wcfClient.Hello(greeting);
Console.WriteLine("Execution passes service call and moves to the WaitHandle.");
this.waitHandle.WaitOne();
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine("Set was called.");
Console.Write("Press ");
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("ENTER");
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write(" to exit...");
Console.ReadLine();
wcfClient.Close();
}
catch (TimeoutException timeProblem)
{
Console.WriteLine("The service operation timed out. " + timeProblem.Message);
Console.ReadLine();
wcfClient.Abort();
}
catch (CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message);
Console.ReadLine();
wcfClient.Abort();
}
}
public static void Main()
{
Client client = new Client();
client.Run();
}
public void Reply(string response)
{
Console.WriteLine("Received output.");
Console.WriteLine("\r\n\t" + response);
this.waitHandle.Set();
}
}
}
Hinweise
Rufen Sie die GetCallbackChannel<T>() Methode auf, um einen Kanal abzurufen, den Sie zum Aufrufen von Vorgängen in der Clientinstanz verwenden können, die den Dienst aufgerufen hat.