Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Toto téma popisuje, jak napsat klientskou aplikaci WCF (Windows Communication Foundation) bez použití třídy a přidruženého System.ServiceModel.ClientBase<TChannel> objektového modelu.
Odesílání zpráv
Abyste mohli posílat zprávy a přijímat a zpracovávat odpovědi, je potřeba provést následující kroky:
Vytvořte vazbu.
Vytvořte továrnu na kanály.
Vytvořte kanál.
Odešlete žádost a přečtete odpověď.
Zavřete všechny objekty kanálu.
Vytvoření vazby
Podobně jako u přijímajícího případu (viz Service Channel-Level Programming) začíná odesílání zpráv vytvořením vazby. Tento příklad vytvoří nový System.ServiceModel.Channels.CustomBinding a přidá System.ServiceModel.Channels.HttpTransportBindingElement do jeho kolekce Elements.
Sestavení ChannelFactory
Místo vytvoření System.ServiceModel.Channels.IChannelListener tentokrát vytvoříme System.ServiceModel.ChannelFactory<TChannel> voláním ChannelFactory.CreateFactory na vazbě, kde je typový parametr System.ServiceModel.Channels.IRequestChannel. Zatímco posluchače kanálu používá strana, která čeká na příchozí zprávy, továrny kanálu používá strana, která zahajuje komunikaci k vytvoření kanálu. Podobně jako posluchače kanálu musí být továrny na kanály nejprve otevřeny, než je lze použít.
Vytvoření kanálu
Pak zavoláme ChannelFactory<TChannel>.CreateChannel, abychom vytvořili IRequestChannel. Toto volání přebírá adresu koncového bodu, se kterým chceme komunikovat pomocí nového kanálu, který se vytváří. Jakmile máme kanál, spustíme funkci Otevřít, abychom ho nastavili do stavu připraveného na komunikaci. V závislosti na povaze přenosu může toto volání open zahájit spojení s cílovým koncovým bodem nebo nemusí v síti vůbec nic dělat.
Odeslání žádosti a přečtení odpovědi
Jakmile máme otevřený kanál, můžeme vytvořit zprávu a použít metodu Request kanálu k odeslání požadavku a počkat, až se odpověď vrátí. Když se tato metoda vrátí, máme zprávu odpovědi, kterou můžeme přečíst, abychom zjistili, co odpověď koncového bodu byla.
Zavírání objektů
Abychom zabránili úniku prostředků, zavřeme objekty používané při komunikaci, když už nejsou potřeba.
Následující příklad kódu ukazuje základního klienta, který používá objekt pro vytváření kanálů k odeslání zprávy a přečtení odpovědi.
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: {replymessage.Headers.Action}");
string data = replymessage.GetBody<string>();
Console.WriteLine($"Reply content: {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