Lire en anglais

Partager via


XmlFormatExtensionAttribute Classe

Définition

Spécifie qu'une extension de format d'une description de service s'exécute sur un ou plusieurs points d'extension. Cette classe ne peut pas être héritée.

C#
[System.AttributeUsage(System.AttributeTargets.Class)]
public sealed class XmlFormatExtensionAttribute : Attribute
C#
[System.AttributeUsage(System.AttributeTargets.Class, Inherited=true)]
public sealed class XmlFormatExtensionAttribute : Attribute
Héritage
XmlFormatExtensionAttribute
Attributs

Exemples

C#
using System;
using System.Security.Permissions;
using System.CodeDom;
using System.IO;
using System.Text;
using System.Web.Services.Configuration;
using System.Web.Services.Description;
using System.Web.Services.Protocols;
using System.Xml.Serialization;

// The YMLAttribute allows a developer to specify that the YML SOAP
// extension run on a per-method basis.  The Disabled property
// turns reversing the XML on and off.

[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
public class YMLAttribute : SoapExtensionAttribute {
    int priority = 0;
    bool disabled = false;

    public YMLAttribute() : this(false) {}
    public YMLAttribute(bool disabled)
    {
        this.disabled = disabled;
    }

    public override Type ExtensionType
    {
        get { return typeof(YMLExtension); }
    }
    public override int Priority
    {
        get { return priority; }
        set { priority = value; }
    }

    public bool Disabled
    {
        get { return disabled; }
        set { disabled = value; }
    }
}

public class YMLExtension : SoapExtension {
    bool disabled = false;
    Stream oldStream;
    Stream newStream;

    public override object GetInitializer(LogicalMethodInfo methodInfo,
        SoapExtensionAttribute attribute)
    {
        YMLAttribute attr = attribute as YMLAttribute;
        if (attr != null) return attr.Disabled;
        return false;
    }

    public override object GetInitializer(Type serviceType)
    {
        return false;
    }

    public override void Initialize(object initializer)
    {
        if (initializer is Boolean) disabled = (bool)initializer;
    }

    public override Stream ChainStream(Stream stream)
    {
        if (disabled) return base.ChainStream(stream);
        oldStream = stream;
        newStream = new MemoryStream();
        return newStream;
    }

    public override void ProcessMessage(SoapMessage message)
    {
        if (disabled) return;
        switch (message.Stage)
        {
        case SoapMessageStage.BeforeSerialize:
            Encode(message);
            break;
        case SoapMessageStage.AfterSerialize:
            newStream.Position = 0;
            Reverse(newStream, oldStream);
            break;
        case SoapMessageStage.BeforeDeserialize:
            Decode(message);
            break;
        case SoapMessageStage.AfterDeserialize:
            break;
        }
    }

    void Encode(SoapMessage message)
    {
        message.ContentType = "text/yml";
    }

    void Decode(SoapMessage message)
    {
        if (message.ContentType != "text/yml")
            throw new Exception(
                "invalid content type:" + message.ContentType);
        Reverse(oldStream, newStream);
        newStream.Position = 0;
        message.ContentType = "text/xml";
    }

    void Reverse(Stream from, Stream to)
    {
        TextReader reader = new StreamReader(from);
        TextWriter writer = new StreamWriter(to);
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            StringBuilder builder = new StringBuilder();
            for (int i = line.Length - 1; i >= 0; i--)
            {
                builder.Append(line[i]);
            }
            writer.WriteLine(builder.ToString());
        }
        writer.Flush();
    }
}
// The YMLReflector class is part of the YML SDFE, as it is
// called during the service description generation process.
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public class YMLReflector : SoapExtensionReflector
{
    public override void ReflectMethod()
    {
        ProtocolReflector reflector = ReflectionContext;
        YMLAttribute attr =
            (YMLAttribute)reflector.Method.GetCustomAttribute(
            typeof(YMLAttribute));
        // If the YMLAttribute has been applied to this XML Web service
        // method, add the XML defined in the YMLOperationBinding class.
        if (attr != null)
        {
            YMLOperationBinding yml = new YMLOperationBinding();
            yml.Reverse = !(attr.Disabled);
            reflector.OperationBinding.Extensions.Add(yml);
        }
    }
}

// The YMLImporter class is part of the YML SDFE, as it is called when a
// proxy class is generated for each XML Web service method the proxy class
// communicates with. The class checks whether the service description
// contains the XML that this SDFE adds to a service description. If it
// exists, then the YMLExtension is applied to the method in the proxy class.
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public class YMLImporter : SoapExtensionImporter
{
    public override void ImportMethod(
        CodeAttributeDeclarationCollection metadata)
    {
        SoapProtocolImporter importer = ImportContext;
        // Check whether the XML specified in the YMLOperationBinding
        // is in the service description.
        YMLOperationBinding yml =
           (YMLOperationBinding)importer.OperationBinding.Extensions.Find(
           typeof(YMLOperationBinding));
        if (yml != null)
        {
            // Only apply the YMLAttribute to the method when the XML should
            // be reversed.
            if (yml.Reverse)
            {
                CodeAttributeDeclaration attr =
                    new CodeAttributeDeclaration(typeof(YMLAttribute).FullName);
                attr.Arguments.Add(
                    new CodeAttributeArgument(new CodePrimitiveExpression(true)));
                metadata.Add(attr);
            }
        }
    }
}

// The YMLOperationBinding class is part of the YML SDFE, as it is the
// class that is serialized into XML and is placed in the service
// description.
[XmlFormatExtension("action", YMLOperationBinding.YMLNamespace,
    typeof(OperationBinding))]
[XmlFormatExtensionPrefix("yml", YMLOperationBinding.YMLNamespace)]
public class YMLOperationBinding : ServiceDescriptionFormatExtension
{
    private Boolean reverse;

    public const string YMLNamespace = "http://www.contoso.com/yml";

    [XmlElement("Reverse")]
    public Boolean Reverse
    {
        get { return reverse; }
        set { reverse = value; }
    }
}

Remarques

Une extension de format de description de service étend la façon dont une description de service est générée pour un service Web XML créé à l’aide de ASP.NET. Plus précisément, une extension de format de description de service ajoute des éléments XML à la description du service. Cela est utile lorsqu’une extension SOAP est conçue pour s’exécuter à la fois sur le côté client et serveur d’un service Web XML, car les informations sur les extensions SOAP ne sont pas placées dans la description du service. Si vous souhaitez ajouter des informations sur l’extension SOAP à la description du service, un client peut interpréter qu’il doit exécuter l’extension SOAP spécifique. Par exemple, une extension SOAP de chiffrement doit être exécutée à la fois sur le client et sur le serveur. Si une extension SOAP de chiffrement s’exécute uniquement sur le serveur et qu’elle chiffre les valeurs de retour avant de les renvoyer au client, l’extension SOAP doit s’exécuter pour déchiffrer le message SOAP. Sinon, le client ne peut pas traiter la valeur de retour.

Pour créer une extension de format de description de service, procédez comme suit :

  1. Générez une classe qui dérive de ServiceDescriptionFormatExtension.

  2. Appliquez une XmlFormatExtensionAttribute à la classe et spécifiez les points d’extension auxquels l’extension de format de description du service doit s’exécuter.

  3. Si vous le souhaitez, appliquez une XmlFormatExtensionPointAttribute à la classe et spécifiez un membre dans la classe qui agit comme un nouveau point d’extension.

  4. Si vous le souhaitez, appliquez une XmlFormatExtensionPrefixAttribute à la classe et spécifiez le préfixe d’espace de noms XML à associer aux éléments XML générés par l’extension de format de description du service.

  5. Configurez l’extension de format de description du service pour qu’elle s’exécute dans la serviceDescriptionFormatExtensionTypes section du fichier de configuration.

Constructeurs

XmlFormatExtensionAttribute()

Initialise une nouvelle instance de la classe XmlFormatExtensionAttribute.

XmlFormatExtensionAttribute(String, String, Type)

Initialise une nouvelle instance de la classe XmlFormatExtensionAttribute qui spécifie l'élément et l'espace de noms XML à ajouter lors de l'exécution au point d'extension spécifié.

XmlFormatExtensionAttribute(String, String, Type, Type)

Initialise une nouvelle instance de la classe XmlFormatExtensionAttribute qui spécifie l'élément et l'espace de noms XML à ajouter lors de l'exécution aux points d'extension spécifiés.

XmlFormatExtensionAttribute(String, String, Type, Type, Type)

Initialise une nouvelle instance de la classe XmlFormatExtensionAttribute qui spécifie l'élément et l'espace de noms XML à ajouter lors de l'exécution aux points d'extension spécifiés.

XmlFormatExtensionAttribute(String, String, Type, Type, Type, Type)

Initialise une nouvelle instance de la classe XmlFormatExtensionAttribute qui spécifie l'élément et l'espace de noms XML à ajouter lors de l'exécution aux points d'extension spécifiés.

XmlFormatExtensionAttribute(String, String, Type[])

Initialise une nouvelle instance de la classe XmlFormatExtensionAttribute qui spécifie l'élément et l'espace de noms XML à ajouter lors de l'exécution aux points d'extension spécifiés.

Propriétés

ElementName

Obtient ou définit l'élément XML ajouté à la description de service par l'extension de format de la description de service.

ExtensionPoints

Étapes au cours desquelles devra être exécutée l'extension de format de la description de service.

Namespace

Obtient ou définit l'espace de noms XML de l'élément XML ajouté à la description de service par l'extension de format de la description de service.

TypeId

Lors de l'implémentation dans une classe dérivée, obtient un identificateur unique pour l'objet Attribute.

(Hérité de Attribute)

Méthodes

Equals(Object)

Retourne une valeur qui indique si cette instance est égale à un objet spécifié.

(Hérité de Attribute)
GetHashCode()

Retourne le code de hachage de cette instance.

(Hérité de Attribute)
GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
IsDefaultAttribute()

En cas de substitution dans une classe dérivée, indique si la valeur de cette instance est la valeur par défaut pour la classe dérivée.

(Hérité de Attribute)
Match(Object)

En cas de substitution dans une classe dérivée, retourne une valeur indiquant si cette instance équivaut à un objet spécifié.

(Hérité de Attribute)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
ToString()

Retourne une chaîne qui représente l'objet actuel.

(Hérité de Object)

Implémentations d’interfaces explicites

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Mappe un jeu de noms avec un jeu correspondant d'identificateurs de dispatch.

(Hérité de Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Récupère les informations de type pour un objet, qui peuvent être utilisées pour obtenir les informations de type d'une interface.

(Hérité de Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Récupère le nombre d'interfaces d'informations de type fourni par un objet (0 ou 1).

(Hérité de Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Fournit l'accès aux propriétés et aux méthodes exposées par un objet.

(Hérité de Attribute)

S’applique à

Produit Versions
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8

Voir aussi