Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’exemple de texte montre comment implémenter un encodeur de sms personnalisé à l’aide de Windows Communication Foundation (WCF).
WCF TextMessageEncodingBindingElement prend uniquement en charge les encodages Unicode UTF-8, UTF-16 et Big Endian. L’encodeur de sms personnalisé dans cet exemple prend en charge tous les encodages de caractères pris en charge par la plateforme qui peuvent être requis pour l’interopérabilité. L’exemple se compose d’un programme de console client (.exe), d’une bibliothèque de services (.dll) hébergée par Internet Information Services (IIS) et d’une bibliothèque d’encodeur de messages texte (.dll). Le service implémente un contrat qui définit un modèle de communication de demande-réponse. Le contrat est défini par l’interface ICalculator , qui expose les opérations mathématiques (Ajouter, Soustraire, Multiplier et Diviser). Le client effectue des requêtes synchrones à une opération mathématique donnée et le service répond avec le résultat. Le client et le service utilisent CustomTextMessageEncoder au lieu de la valeur par défaut TextMessageEncodingBindingElement.
L’implémentation de l’encodeur personnalisé se compose d’une fabrique d’encodeur de message, d’un encodeur de message, d’un élément de liaison d’encodage de message et d’un gestionnaire de configuration, et illustre les éléments suivants :
Création d’un encodeur personnalisé et d’une fabrique d’encodeur.
Création d’un élément de liaison pour un encodeur personnalisé.
Utilisation de la configuration de liaison personnalisée pour l’intégration d’éléments de liaison personnalisés.
Développement d’un gestionnaire de configuration personnalisé pour autoriser la configuration de fichier d’un élément de liaison personnalisé.
Pour configurer, générer et exécuter l’exemple
Installez ASP.NET 4.0 à l’aide de la commande suivante.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enableAssurez-vous d’avoir effectué la Procédure d’installation unique pour les exemples Windows Communication Foundation.
Pour générer la solution, suivez les instructions de Création des exemples Windows Communication Foundation.
Pour exécuter l’exemple dans une configuration à un ou plusieurs ordinateurs, conformez-vous aux instructions figurant dans la rubrique Exécution des exemples Windows Communication Foundation.
Fabrique de l’encodeur de message et encodeur de message
Lorsque ServiceHost ou le canal client est ouvert, le composant au moment du design CustomTextMessageBindingElement crée CustomTextMessageEncoderFactory. La fabrique crée CustomTextMessageEncoder. L’encodeur de message fonctionne à la fois en mode streaming et en mode mis en mémoire tampon. Il utilise le XmlReader pour lire les messages et le XmlWriter pour les écrire respectivement. Contrairement aux lecteurs ET enregistreurs XML optimisés de WCF qui prennent uniquement en charge UTF-8, UTF-16 et Unicode big-endian, ces lecteurs et enregistreurs prennent en charge tout l’encodage pris en charge par la plateforme.
L’exemple de code suivant montre 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();
}
}
L’exemple de code suivant montre comment créer la fabrique d'encodeurs de messages.
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;
}
}
}
Élément de liaison d'encodage de message
Les éléments de liaison autorisent la configuration de la pile d’exécution WCF. Pour utiliser l’encodeur de message personnalisé dans une application WCF, un élément de liaison est requis pour créer la fabrique d’encodeur de message avec les paramètres appropriés au niveau approprié dans la pile d’exécution.
CustomTextMessageBindingElement dérive de la classe de base BindingElement et hérite de la classe MessageEncodingBindingElement. Cela permet à d’autres composants WCF de reconnaître cet élément de liaison comme étant un élément de liaison d’encodage de message. L'implémentation de CreateMessageEncoderFactory retourne une instance de la fabrique d'encodeur de message correspondante avec les paramètres appropriés.
CustomTextMessageBindingElement expose les paramètres pour MessageVersion, ContentType, et Encoding par le biais des propriétés. L’encodeur prend en charge les versions Soap11Addressing et Soap12Addressing1. La valeur par défaut est Soap11Addressing1. La valeur par défaut est ContentType « text/xml ». La Encoding propriété vous permet de définir la valeur de l’encodage de caractères souhaité. L’exemple de client et de service utilise l’encodage de caractères ISO-8859-1 (Latin1), qui n’est pas pris en charge par le TextMessageEncodingBindingElement de WCF.
Le code suivant montre comment créer par programmation la liaison à l’aide de l’encodeur de sms personnalisé.
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);
Ajout de la prise en charge des métadonnées à l’élément de liaison d’encodage de message
Tout type qui dérive de MessageEncodingBindingElement est responsable de la mise à jour de la version de la liaison SOAP dans le document WSDL généré pour le service. Pour ce faire, implémentez la ExportEndpoint méthode sur l’interface IWsdlExportExtension , puis modifiez le WSDL généré. Dans cet exemple, le CustomTextMessageBindingElement utilise la logique d'exportation WSDL depuis le TextMessageEncodingBindingElement.
Pour cet exemple, la configuration du client est configurée manuellement. Vous ne pouvez pas utiliser Svcutil.exe pour générer la configuration du client, car CustomTextMessageBindingElement n'exporte pas d'assertion de politique pour décrire son comportement. Vous devez généralement implémenter l’interface IPolicyExportExtension sur un élément de liaison personnalisé pour exporter une assertion de stratégie personnalisée qui décrit le comportement ou la fonctionnalité implémenté par l’élément de liaison. Pour obtenir un exemple d’exportation d’une assertion de stratégie pour un élément de liaison personnalisé, consultez l’exemple Transport : UDP .
Gestionnaire de configuration de liaison d’encodage de message
La section précédente montre comment utiliser l’encodeur de sms personnalisé par programmation. Il CustomTextMessageEncodingBindingSection implémente un gestionnaire de configuration qui vous permet de spécifier l’utilisation d’un encodeur de sms personnalisé dans un fichier de configuration. La CustomTextMessageEncodingBindingSection classe dérive de la BindingElementExtensionElement classe. La BindingElementType propriété informe le système de configuration du type d’élément de liaison à créer pour cette section.
Tous les paramètres définis par CustomTextMessageBindingElement sont exposés en tant que propriétés dans le CustomTextMessageEncodingBindingSection.
ConfigurationPropertyAttribute permet d'associer les attributs des éléments de configuration aux propriétés et de définir des valeurs par défaut en l'absence d'attribut. Une fois les valeurs de configuration chargées et appliquées aux propriétés du type, la CreateBindingElement méthode est appelée, qui convertit les propriétés en une instance concrète d’un élément de liaison.
Ce gestionnaire de configuration correspond à la représentation suivante dans les App.config ou Web.config pour le service ou le client.
<customTextMessageEncoding encoding="utf-8" contentType="text/xml" messageVersion="Soap11Addressing1" />
L’exemple utilise l’encodage ISO-8859-1.
Pour utiliser ce gestionnaire de configuration, il doit être inscrit à l’aide de l’élément de configuration suivant.
<extensions>
<bindingElementExtensions>
<add name="customTextMessageEncoding" type="
Microsoft.ServiceModel.Samples.CustomTextMessageEncodingBindingSection,
CustomTextMessageEncoder" />
</bindingElementExtensions>
</extensions>