Programmeren op clientkanaalniveau
In dit onderwerp wordt beschreven hoe u een WCF-clienttoepassing (Windows Communication Foundation) schrijft zonder de klasse en het System.ServiceModel.ClientBase<TChannel> bijbehorende objectmodel te gebruiken.
Berichten verzenden
Als u klaar wilt zijn voor het verzenden van berichten en het ontvangen en verwerken van antwoorden, zijn de volgende stappen vereist:
Maak een binding.
Bouw een kanaalfactory.
Maak een kanaal.
Verzend een aanvraag en lees het antwoord.
Sluit alle kanaalobjecten.
Een binding maken
Net als bij de ontvangende aanvraag (zie Programmeren op servicekanaalniveau), begint het verzenden van berichten door een binding te maken. In dit voorbeeld wordt een nieuwe System.ServiceModel.Channels.CustomBinding gemaakt en wordt er een System.ServiceModel.Channels.HttpTransportBindingElement toegevoegd aan de elementenverzameling.
Een ChannelFactory bouwen
In plaats van een System.ServiceModel.Channels.IChannelListener, deze keer maken we een System.ServiceModel.ChannelFactory<TChannel> door de binding aan te roepen ChannelFactory.CreateFactory waar de typeparameter zich bevindt System.ServiceModel.Channels.IRequestChannel. Hoewel kanaallisteners worden gebruikt aan de kant die wacht op binnenkomende berichten, worden kanaalfactory's gebruikt aan de kant die de communicatie initieert om een kanaal te maken. Net als kanaallisteners moeten kanaalfactory's eerst worden geopend voordat ze kunnen worden gebruikt.
Een kanaal maken
Vervolgens roepen we aan ChannelFactory<TChannel>.CreateChannel om een IRequestChannel. Met deze aanroep wordt het adres van het eindpunt gebruikt waarmee we willen communiceren met behulp van het nieuwe kanaal dat wordt gemaakt. Zodra we een kanaal hebben, roepen we Open erop aan om het in een status te plaatsen die gereed is voor communicatie. Afhankelijk van de aard van het transport kan deze aanroep van Open een verbinding met het doeleindpunt initiƫren of helemaal niets doen op het netwerk.
Een aanvraag verzenden en het antwoord lezen
Zodra we een geopend kanaal hebben, kunnen we een bericht maken en de aanvraagmethode van het kanaal gebruiken om de aanvraag te verzenden en te wachten tot het antwoord terugkomt. Wanneer deze methode wordt geretourneerd, hebben we een antwoordbericht dat we kunnen lezen om erachter te komen wat het antwoord van het eindpunt was.
Objecten sluiten
Om te voorkomen dat resources worden gelekt, sluiten we objecten die worden gebruikt in communicatie wanneer ze niet meer nodig zijn.
In het volgende codevoorbeeld ziet u een basisclient met behulp van de kanaalfactory om een bericht te verzenden en het antwoord te lezen.
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
namespace ProgrammingChannels
{
class Client
{
static void RunClient()
{
//Step1: Create a binding with just HTTP.
BindingElement[] bindingElements = new BindingElement[2];
bindingElements[0] = new TextMessageEncodingBindingElement();
bindingElements[1] = new HttpTransportBindingElement();
CustomBinding binding = new CustomBinding(bindingElements);
//Step2: Use the binding to build the channel factory.
IChannelFactory<IRequestChannel> factory =
binding.BuildChannelFactory<IRequestChannel>(
new BindingParameterCollection());
//Open the channel factory.
factory.Open();
//Step3: Use the channel factory to create a channel.
IRequestChannel channel = factory.CreateChannel(
new EndpointAddress("http://localhost:8080/channelapp"));
channel.Open();
//Step4: Create a message.
Message requestmessage = Message.CreateMessage(
binding.MessageVersion,
"http://contoso.com/someaction",
"This is the body data");
//Send message.
Message replymessage = channel.Request(requestmessage);
Console.WriteLine("Reply message received");
Console.WriteLine("Reply action: {0}",
replymessage.Headers.Action);
string data = replymessage.GetBody<string>();
Console.WriteLine("Reply content: {0}", data);
//Step5: Do not forget to close the message.
replymessage.Close();
//Do not forget to close the channel.
channel.Close();
//Do not forget to close the factory.
factory.Close();
}
public static void Main()
{
Console.WriteLine("Press [ENTER] when service is ready");
Console.ReadLine();
RunClient();
Console.WriteLine("Press [ENTER] to exit");
Console.ReadLine();
}
}
}
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.ServiceModel.Configuration
Namespace ProgrammingChannels
Friend Class Client
Private Shared Sub RunClient()
'Step1: Create a binding with just HTTP.
Dim bindingElements(1) As BindingElement = {New TextMessageEncodingBindingElement(), _
New HttpTransportBindingElement()}
Dim binding As New CustomBinding(bindingElements)
'Step2: Use the binding to build the channel factory.
Dim factory = binding.BuildChannelFactory(Of IRequestChannel)(New BindingParameterCollection())
'Open the channel factory.
factory.Open()
'Step3: Use the channel factory to create a channel.
Dim channel = factory.CreateChannel(New EndpointAddress("http://localhost:8080/channelapp"))
channel.Open()
'Step4: Create a message.
Dim requestmessage = Message.CreateMessage(binding.MessageVersion, _
"http://contoso.com/someaction", _
"This is the body data")
'Send message.
Dim replymessage = channel.Request(requestmessage)
Console.WriteLine("Reply message received")
Console.WriteLine("Reply action: {0}", replymessage.Headers.Action)
Dim data = replymessage.GetBody(Of String)()
Console.WriteLine("Reply content: {0}", data)
'Step5: Do not forget to close the message.
replymessage.Close()
'Do not forget to close the channel.
channel.Close()
'Do not forget to close the factory.
factory.Close()
End Sub
Public Shared Sub Main()
Console.WriteLine("Press [ENTER] when service is ready")
Console.ReadLine()
RunClient()
Console.WriteLine("Press [ENTER] to exit")
Console.ReadLine()
End Sub
End Class
End Namespace