Auf Englisch lesen

Freigeben über


XmlFormatExtensionPointAttribute-Klasse

Gibt den XML-Namespace und das XML-Namespacepräfix an, die innerhalb einer Dienstbeschreibung für eine Formaterweiterung einer Dienstbeschreibung verwendet werden sollen. Diese Klasse kann nicht geerbt werden.

Namespace: System.Web.Services.Configuration
Assembly: System.Web.Services (in system.web.services.dll)

Syntax

[AttributeUsageAttribute(AttributeTargets.Class)] 
public sealed class XmlFormatExtensionPointAttribute : Attribute

Hinweise

Eine Formaterweiterung der Dienstbeschreibung erweitert das Generieren einer Dienstbeschreibung für einen mit ASP.NET erstellten XML-Webdienst. Genauer gesagt werden durch eine Formaterweiterung der Dienstbeschreibung XML-Elemente zur Dienstbeschreibung hinzugefügt. Dies bietet sich an, wenn eine SOAP-Erweiterung zur Ausführung sowohl auf der Client- als auch auf der Serverseite eines XML-Webdiensts erstellt wurde, da Informationen über SOAP-Erweiterungen nicht automatisch in der Dienstbeschreibung platziert werden. Wenn Sie der Dienstbeschreibung Informationen zur SOAP-Erweiterung hinzufügen, weiß ein Client, dass diese SOAP-Erweiterung ausgeführt werden muss. Ein Beispiel für eine SOAP-Erweiterung, die sowohl auf dem Client als auch auf dem Server ausgeführt werden muss, ist eine Verschlüsselungs-SOAP-Erweiterung. Wenn eine Verschlüsselungs-SOAP-Erweiterung lediglich auf dem Server ausgeführt wird und Rückgabewerte verschlüsselt, bevor diese an den Client zurückgesendet werden, muss die SOAP-Erweiterung zum Entschlüsseln der SOAP-Nachricht auf dem Client ausgeführt werden. Andernfalls kann der Client den Rückgabewert nicht verarbeiten.

Gehen Sie zum Erstellen einer Formaterweiterung der Dienstbeschreibung wie folgt vor:

  1. Erstellen Sie eine Klasse, die von ServiceDescriptionFormatExtension abgeleitet ist.

  2. Wenden Sie ein XmlFormatExtensionAttribute auf die Klasse an, und geben Sie die Erweiterungspunkte an, an denen die Formaterweiterung der Dienstbeschreibung ausgeführt werden soll.

  3. Optional können Sie der Klasse auch ein XmlFormatExtensionPointAttribute zuweisen und einen Member in der Klasse angeben, der als neuer Erweiterungspunkt fungiert.

  4. Alternativ können Sie auch ein XmlFormatExtensionPrefixAttribute auf die Klasse anwenden und das XML-Namespacepräfix angeben, das den durch die Formaterweiterung der Dienstbeschreibung generierten XML-Elementen zugeordnet werden soll.

  5. Konfigurieren Sie die Formaterweiterung der Dienstbeschreibung so, dass sie im serviceDescriptionFormatExtensionTypes-Abschnitt der Konfigurationsdatei ausgeführt wird.

Beispiel

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 = "https://www.contoso.com/yml";

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

Vererbungshierarchie

System.Object
   System.Attribute
    System.Web.Services.Configuration.XmlFormatExtensionPointAttribute

Threadsicherheit

Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Plattformen

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

Siehe auch

Referenz

XmlFormatExtensionPointAttribute-Member
System.Web.Services.Configuration-Namespace