Vlastní kodér zpráv: Vlastní kodér textu
Ukázka textu ukazuje, jak implementovat vlastní kodér textových zpráv pomocí wcf (Windows Communication Foundation).
Wcf TextMessageEncodingBindingElement podporuje pouze kódování UTF-8, UTF-16 a big-endian Unicode. Vlastní kodér textových zpráv v této ukázce podporuje všechna kódování znaků podporovaná platformou, které mohou být vyžadovány pro interoperabilitu. Ukázka se skládá z programu klientské konzoly (.exe), knihovny služeb (.dll) hostované službou Internetová informační služba (IIS) a knihovny kodéru textových zpráv (.dll). Služba implementuje kontrakt, který definuje komunikační vzor žádosti a odpovědi. Kontrakt je definován ICalculator
rozhraním, které zveřejňuje matematické operace (sčítání, odčítání, násobení a dělení). Klient provádí synchronní požadavky na danou matematickou operaci a služba odpoví výsledkem. Klient i služba používají CustomTextMessageEncoder
místo výchozího TextMessageEncodingBindingElement.
Implementace vlastního kodéru se skládá z továrny kodéru zpráv, kodéru zpráv, elementu vazby kódování zpráv a obslužné rutiny konfigurace a ukazuje následující:
Vytvoření vlastního kodéru a objektu pro vytváření kodérů
Vytvoření elementu vazby pro vlastní kodér
Použití vlastní konfigurace vazby pro integraci vlastních prvků vazby.
Vývoj vlastní obslužné rutiny konfigurace umožňující konfiguraci souboru vlastního elementu vazby
Nastavení, sestavení a spuštění ukázky
Pomocí následujícího příkazu nainstalujte ASP.NET 4.0.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.
Pokud chcete sestavit řešení, postupujte podle pokynů v části Sestavení ukázek Windows Communication Foundation.
Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.
Message Encoder Factory a Kodér zpráv
ServiceHost Při otevření kanálu klienta vytvoří komponenta CustomTextMessageBindingElement
času návrhu CustomTextMessageEncoderFactory
. Objekt pro vytváření vytvoří CustomTextMessageEncoder
. Kodér zpráv funguje v režimu streamování i v režimu vyrovnávací paměti. Používá XmlReader zprávy a XmlWriter ke čtení a zápisu zpráv. Na rozdíl od optimalizovaných čteček XML a zapisovačů WCF, které podporují pouze kódování UTF-8, UTF-16 a big-endian Unicode, tyto čtenáři a zapisovače podporují veškeré kódování podporované platformou.
Následující příklad kódu ukazuje CustomTextMessageEncoder.
public class CustomTextMessageEncoder : MessageEncoder
{
private CustomTextMessageEncoderFactory factory;
private XmlWriterSettings writerSettings;
private string contentType;
public CustomTextMessageEncoder(CustomTextMessageEncoderFactory factory)
{
this.factory = factory;
this.writerSettings = new XmlWriterSettings();
this.writerSettings.Encoding = Encoding.GetEncoding(factory.CharSet);
this.contentType = $"{this.factory.MediaType}; charset={this.writerSettings.Encoding.HeaderName}";
}
public override string ContentType
{
get
{
return this.contentType;
}
}
public override string MediaType
{
get
{
return factory.MediaType;
}
}
public override MessageVersion MessageVersion
{
get
{
return this.factory.MessageVersion;
}
}
public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType)
{
byte[] msgContents = new byte[buffer.Count];
Array.Copy(buffer.Array, buffer.Offset, msgContents, 0, msgContents.Length);
bufferManager.ReturnBuffer(buffer.Array);
MemoryStream stream = new MemoryStream(msgContents);
return ReadMessage(stream, int.MaxValue);
}
public override Message ReadMessage(Stream stream, int maxSizeOfHeaders, string contentType)
{
XmlReader reader = XmlReader.Create(stream);
return Message.CreateMessage(reader, maxSizeOfHeaders, this.MessageVersion);
}
public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
{
MemoryStream stream = new MemoryStream();
XmlWriter writer = XmlWriter.Create(stream, this.writerSettings);
message.WriteMessage(writer);
writer.Close();
byte[] messageBytes = stream.GetBuffer();
int messageLength = (int)stream.Position;
stream.Close();
int totalLength = messageLength + messageOffset;
byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageLength);
ArraySegment<byte> byteArray = new ArraySegment<byte>(totalBytes, messageOffset, messageLength);
return byteArray;
}
public override void WriteMessage(Message message, Stream stream)
{
XmlWriter writer = XmlWriter.Create(stream, this.writerSettings);
message.WriteMessage(writer);
writer.Close();
}
}
Následující příklad kódu ukazuje, jak sestavit továrnu kodéru zpráv.
public class CustomTextMessageEncoderFactory : MessageEncoderFactory
{
private MessageEncoder encoder;
private MessageVersion version;
private string mediaType;
private string charSet;
internal CustomTextMessageEncoderFactory(string mediaType, string charSet,
MessageVersion version)
{
this.version = version;
this.mediaType = mediaType;
this.charSet = charSet;
this.encoder = new CustomTextMessageEncoder(this);
}
public override MessageEncoder Encoder
{
get
{
return this.encoder;
}
}
public override MessageVersion MessageVersion
{
get
{
return this.version;
}
}
internal string MediaType
{
get
{
return this.mediaType;
}
}
internal string CharSet
{
get
{
return this.charSet;
}
}
}
Element vazby kódování zpráv
Prvky vazby umožňují konfiguraci zásobníku běhového běhu WCF. Pokud chcete použít vlastní kodér zpráv v aplikaci WCF, je vyžadován element vazby, který vytvoří továrnu kodéru zpráv s odpovídajícími nastaveními na příslušné úrovni v zásobníku runtime.
Odvozena CustomTextMessageBindingElement
ze BindingElement základní třídy a dědí z MessageEncodingBindingElement třídy. To umožňuje ostatním komponentám WCF rozpoznat tento element vazby jako element vazby kódování zpráv. Implementace CreateMessageEncoderFactory vrátí instanci odpovídající továrny kodéru zpráv s odpovídajícím nastavením.
Zpřístupňuje CustomTextMessageBindingElement
nastavení pro MessageVersion
, ContentType
a Encoding
prostřednictvím vlastností. Kodér podporuje verze Soap11Addressing i Soap12Addressing1. Výchozí hodnota je Soap11Addressing1. Výchozí hodnota ContentType
je text/xml. Tato Encoding
vlastnost umožňuje nastavit hodnotu požadovaného kódování znaků. Ukázkový klient a služba používají kódování znaků ISO-8859-1 (Latin1), které wcf nepodporuje TextMessageEncodingBindingElement .
Následující kód ukazuje, jak vytvořit vazbu prostřednictvím kódu programu pomocí vlastního kodéru textových zpráv.
ICollection<BindingElement> bindingElements = new List<BindingElement>();
HttpTransportBindingElement httpBindingElement = new HttpTransportBindingElement();
CustomTextMessageBindingElement textBindingElement = new CustomTextMessageBindingElement();
bindingElements.Add(textBindingElement);
bindingElements.Add(httpBindingElement);
CustomBinding binding = new CustomBinding(bindingElements);
Přidání podpory metadat do elementu vazby kódování zpráv
Za aktualizaci verze vazby SOAP v dokumentu WSDL vygenerovaném pro službu zodpovídá jakýkoli typ odvozený z MessageEncodingBindingElement tohoto typu. To se provádí implementací ExportEndpoint
metody v IWsdlExportExtension rozhraní a následnou úpravou vygenerovaného WSDL. V této ukázce se používá logika CustomTextMessageBindingElement
exportu WSDL z objektu TextMessageEncodingBindingElement
.
Pro tuto ukázku se konfigurace klienta konfiguruje ručně. Nelze použít Svcutil.exe ke generování konfigurace klienta, protože CustomTextMessageBindingElement
neexportuje kontrolní výraz zásad pro popis jeho chování. Obecně byste měli implementovat IPolicyExportExtension rozhraní u vlastního elementu vazby k exportu vlastního kontrolního výrazu zásad, který popisuje chování nebo schopnosti implementované elementem vazby. Příklad exportu kontrolního výrazu zásad pro vlastní element vazby najdete v ukázce Transport: UDP .
Obslužná rutina konfigurace vazby kódování zpráv
Předchozí část ukazuje, jak programově používat vlastní kodér textových zpráv. Implementuje CustomTextMessageEncodingBindingSection
obslužnou rutinu konfigurace, která umožňuje zadat použití vlastního kodéru textových zpráv v rámci konfiguračního souboru. Třída CustomTextMessageEncodingBindingSection
je odvozena od BindingElementExtensionElement třídy. Vlastnost BindingElementType
informuje konfigurační systém o typu element vazby, který se má vytvořit pro tuto část.
Všechna nastavení definovaná CustomTextMessageBindingElement
pomocí jsou vystavena jako vlastnosti v objektu CustomTextMessageEncodingBindingSection
. Pomáhá ConfigurationPropertyAttribute při mapování atributů elementu konfigurace na vlastnosti a nastavení výchozích hodnot, pokud atribut není nastaven. Po načtení a použití hodnot z konfigurace vlastnosti typu je CreateBindingElement volána metoda, která převede vlastnosti na konkrétní instanci element vazby.
Tato obslužná rutina konfigurace se mapuje na následující reprezentaci v souboru App.config nebo Web.config pro službu nebo klienta.
<customTextMessageEncoding encoding="utf-8" contentType="text/xml" messageVersion="Soap11Addressing1" />
Ukázka používá kódování ISO-8859-1.
Chcete-li použít tuto obslužnou rutinu konfigurace, musí být registrována pomocí následujícího konfiguračního prvku.
<extensions>
<bindingElementExtensions>
<add name="customTextMessageEncoding" type="
Microsoft.ServiceModel.Samples.CustomTextMessageEncodingBindingSection,
CustomTextMessageEncoder" />
</bindingElementExtensions>
</extensions>