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.
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 konzoly klienta (.exe), knihovny služeb (.dll) hostované internetovou informační službou (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 enkodéru se skládá z továrny enkodéru zpráv, enkodéru zpráv, prvku vazby pro kódování zpráv a obslužné rutiny pro konfiguraci a ukazuje následující:
Vytvoření vlastního kodéru a továrny na kodéry
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
Jak nastavit, sestavit a spustit ukázku
Pomocí následujícího příkazu nainstalujte ASP.NET 4.0.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enableUjistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.
Pro sestavení řešení postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.
Pokud chcete spustit ukázku v konfiguraci pro jeden počítač nebo pro více počítačů, postupujte podle pokynů v Spuštění ukázek Windows Communication Foundation.
Message Encoder Factory a Kodér zpráv
Když je otevřen ServiceHost nebo klientský kanál, komponenta CustomTextMessageBindingElement času návrhu vytvoří CustomTextMessageEncoderFactory. Továrna vytvoří CustomTextMessageEncoder. Kodér zpráv funguje v režimu streamování i v režimu vyrovnávací paměti. Používá XmlReader ke čtení zpráv a XmlWriter k 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;
}
}
}
Prvek vazby pro kódování zpráv
Prvky vazby umožňují konfiguraci zásobníku běhového prostředí WCF. Pro použití vlastního kodéru zpráv v aplikaci WCF je vyžadován prvek vazby. Ten vytvoří továrnu kodéru zpráv s odpovídajícími nastaveními na odpovídající úrovni v zásobníku modulu 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 příslušným nastavením.
Zpřístupňuje CustomTextMessageBindingElement nastavení pro MessageVersion, ContentTypea 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é není podporováno TextMessageEncodingBindingElement WCF.
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 pro metadata do elementu vazby pro kódování zpráv
Jakýkoli typ odvozený z MessageEncodingBindingElement je zodpovědný za aktualizaci verze vazby SOAP v dokumentu WSDL vygenerovaném pro službu. To se provádí implementací ExportEndpoint metody v IWsdlExportExtension rozhraní a následnou úpravou vygenerovaného WSDL. V této ukázce používá CustomTextMessageBindingElement logiku exportu WSDL z 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 prohlášení zásad pro popis svého chování. Obecně byste měli implementovat IPolicyExportExtension rozhraní na vlastním elementu vazby pro export vlastního zásadového tvrzení, pro popis chování nebo schopností implementovaných 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 na vlastnosti typu je zavolána metoda CreateBindingElement, která tyto vlastnosti převede na konkrétní instanci vazebního prvku.
Tato konfigurační obslužná rutina odpovídá následujícímu zobrazení v 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>