Programmering på klientkanalnivå
I det här avsnittet beskrivs hur du skriver ett WCF-klientprogram (Windows Communication Foundation) utan att använda System.ServiceModel.ClientBase<TChannel> klassen och dess associerade objektmodell.
Skicka meddelanden
För att vara redo att skicka meddelanden och ta emot och bearbeta svar krävs följande steg:
Skapa en bindning.
Skapa en kanalfabrik.
Skapa en kanal.
Skicka en begäran och läs svaret.
Stäng alla kanalobjekt.
Skapa en bindning
På samma sätt som det mottagande fallet (se Service Channel-Level Programming) startar sändningen av meddelanden genom att skapa en bindning. Det här exemplet skapar en ny System.ServiceModel.Channels.CustomBinding och lägger till en System.ServiceModel.Channels.HttpTransportBindingElement i dess Element-samling.
Skapa en ChannelFactory
I stället för att skapa en System.ServiceModel.Channels.IChannelListenerskapar vi en System.ServiceModel.ChannelFactory<TChannel> genom att anropa ChannelFactory.CreateFactory bindningen där typparametern är System.ServiceModel.Channels.IRequestChannel. Kanallyssnare används vid sidan som väntar på inkommande meddelanden, men kanalfabriker används av den sida som initierar kommunikationen för att skapa en kanal. Precis som kanallyssnare måste kanalfabriker öppnas först innan de kan användas.
Skapa en kanal
Sedan anropar ChannelFactory<TChannel>.CreateChannel vi för att skapa en IRequestChannel. Det här anropet tar adressen till slutpunkten som vi vill kommunicera med med den nya kanalen som skapas. När vi har en kanal anropar vi Öppna på den för att placera den i ett tillstånd som är redo för kommunikation. Beroende på transportens art kan det här anropet till Open initiera en anslutning till målslutpunkten eller göra ingenting alls i nätverket.
Skicka en begäran och läsa svaret
När vi har en öppen kanal kan vi skapa ett meddelande och använda kanalens metod Förfrågning för att skicka begäran och vänta tills svaret kommer tillbaka. När den här metoden returneras har vi ett svarsmeddelande som vi kan läsa för att ta reda på vad slutpunktens svar var.
Stänga objekt
För att undvika läckande resurser stänger vi objekt som används i kommunikationen när de inte längre behövs.
I följande kodexempel visas en grundläggande klient som använder kanalfabriken för att skicka ett meddelande och läsa svaret.
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