Nasıl yapılır: Çift yönlü anlaşma ile hizmetlere erişme
Windows Communication Foundation'ın (WCF) bir özelliği, çift yönlü mesajlaşma düzeni kullanan bir hizmet oluşturabilme özelliğidir. Bu düzen, bir hizmetin bir geri çağırma aracılığıyla istemciyle iletişim kurmasına olanak tanır. Bu konu, geri çağırma arabirimini uygulayan bir istemci sınıfında WCF istemcisi oluşturma adımlarını gösterir.
İkili bağlama, istemcinin IP adresini hizmete sunar. İstemci, yalnızca güvendiği hizmetlere bağlandığından emin olmak için güvenliği kullanmalıdır.
Temel bir WCF hizmeti ve istemcisi oluşturma öğreticisi için bkz . Başlarken Öğreticisi.
Çift yönlü hizmete erişmek için
İki arabirim içeren bir hizmet oluşturun. İlk arabirim hizmet için, ikincisi geri çağırma içindir. Çift yönlü hizmet oluşturma hakkında daha fazla bilgi için bkz . Nasıl yapılır: Çift Yönlü Sözleşme Oluşturma.
Hizmeti çalıştırın.
İstemci için sözleşmeler (arabirimler) oluşturmak için ServiceModel Meta Veri Yardımcı Programı Aracı'nı (Svcutil.exe) kullanın. Bunun nasıl yapılacağını öğrenmek için bkz . Nasıl yapılır: İstemci Oluşturma.
Aşağıdaki örnekte gösterildiği gibi istemci sınıfında geri çağırma arabirimini uygulayın.
public class CallbackHandler : ICalculatorDuplexCallback { public void Result(double result) { Console.WriteLine("Result ({0})", result); } public void Equation(string equation) { Console.WriteLine("Equation({0})", equation); } }
Public Class CallbackHandler Implements ICalculatorDuplexCallback Public Sub Result (ByVal result As Double) Console.WriteLine("Result ({0})", result) End Sub Public Sub Equation(ByVal equation As String) Console.WriteLine("Equation({0})", equation) End Sub End Class
Öğesinin bir örneğini oluşturur InstanceContext sınıfı. Oluşturucu, istemci sınıfının bir örneğini gerektirir.
InstanceContext site = new InstanceContext(new CallbackHandler());
Dim site As InstanceContext = New InstanceContext(new CallbackHandler())
Nesne gerektiren oluşturucuyu kullanarak WCF istemcisinin bir InstanceContext örneğini oluşturun. Oluşturucunun ikinci parametresi, yapılandırma dosyasında bulunan bir uç noktanın adıdır.
CalculatorDuplexClient wcfClient = new CalculatorDuplexClient(site, "default");
Dim wcfClient As New CalculatorDuplexClient(site, "default")
WCF istemcisinin yöntemlerini gerektiği gibi çağırın.
Örnek
Aşağıdaki kod örneğinde çift yönlü bir sözleşmeye erişen bir istemci sınıfının nasıl oluşturulacağı gösterilmektedir.
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
// Define class that implements the callback interface of duplex
// contract.
public class CallbackHandler : ICalculatorDuplexCallback
{
public void Result(double result)
{
Console.WriteLine("Result({0})", result);
}
public void Equation(string equation)
{
Console.WriteLine("Equation({0})", equation);
}
}
public class Client
{
public static void Main()
{
// Picks up configuration from the config file.
CalculatorDuplexClient wcfClient
= new CalculatorDuplexClient(new InstanceContext(new CallbackHandler()));
try
{
// Call the AddTo service operation.
double value = 100.00D;
wcfClient.AddTo(value);
// Call the SubtractFrom service operation.
value = 50.00D;
wcfClient.SubtractFrom(value);
// Call the MultiplyBy service operation.
value = 17.65D;
wcfClient.MultiplyBy(value);
// Call the DivideBy service operation.
value = 2.00D;
wcfClient.DivideBy(value);
// Complete equation.
wcfClient.Clear();
// Wait for callback messages to complete before
// closing.
System.Threading.Thread.Sleep(5000);
// Close the WCF client.
wcfClient.Close();
Console.WriteLine("Done!");
}
catch (TimeoutException timeProblem)
{
Console.WriteLine("The service operation timed out. " + timeProblem.Message);
wcfClient.Abort();
Console.Read();
}
catch (CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message);
wcfClient.Abort();
Console.Read();
}
}
}
Imports System.ServiceModel
Namespace Microsoft.ServiceModel.Samples
' The service contract is defined in generatedClient.vb, generated from the service by the svcutil tool.
' Define class which implements callback interface of duplex contract
Public Class CallbackHandler
Implements ICalculatorDuplexCallback
Public Sub Result(ByVal result As Double) Implements ICalculatorDuplexCallback.Result
Console.WriteLine("Result({0})", result)
End Sub
Public Sub Equation(ByVal eqn As String) Implements ICalculatorDuplexCallback.Equation
Console.WriteLine("Equation({0})", eqn)
End Sub
End Class
Class Client
Public Shared Sub Main()
' Construct InstanceContext to handle messages on callback interface
Dim instanceContext As New InstanceContext(New CallbackHandler())
' Create a client
Dim wcfClient As New CalculatorDuplexClient(instanceContext)
Console.WriteLine("Press <ENTER> to terminate client once the output is displayed.")
Console.WriteLine()
Try
' Call the AddTo service operation.
Dim value As Double = 100
wcfClient.AddTo(value)
' Call the SubtractFrom service operation.
value = 50
wcfClient.SubtractFrom(value)
' Call the MultiplyBy service operation.
value = 17.65
wcfClient.MultiplyBy(value)
' Call the DivideBy service operation.
value = 2
wcfClient.DivideBy(value)
' Complete equation
wcfClient.Clear()
Console.ReadLine()
'Closing the client gracefully closes the connection and cleans up resources
wcfClient.Close()
Catch timeout As TimeoutException
Console.WriteLine(timeout.Message)
wcfClient.Abort()
Catch commException As CommunicationException
Console.WriteLine(commException.Message)
wcfClient.Abort()
End Try
End Sub
End Class
End Namespace