XmlFormatExtensionAttribute Sınıf

Tanım

Hizmet açıklaması biçim uzantısının bir veya daha fazla uzantı noktasında çalıştırıldığını belirtir. Bu sınıf devralınamaz.

C#
[System.AttributeUsage(System.AttributeTargets.Class)]
public sealed class XmlFormatExtensionAttribute : Attribute
Devralma
XmlFormatExtensionAttribute
Öznitelikler

Örnekler

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; }
    }
}

Açıklamalar

Hizmet açıklaması biçim uzantısı, ASP.NET kullanılarak oluşturulan bir XML Web hizmeti için hizmet açıklamasının nasıl oluşturulduğunu genişletir. Özellikle, hizmet açıklaması biçim uzantısı hizmet açıklamasına XML öğeleri ekler. SOAP uzantılarıyla ilgili bilgiler hizmet açıklamasına yerleştirilmediğinden, SOAP uzantısı bir XML Web hizmetinin hem istemci hem de sunucu tarafında çalışacak şekilde oluşturulduğunda kullanışlıdır. Hizmet açıklamasına SOAP uzantısı hakkında bilgi eklemek istiyorsanız, bir istemci belirli SOAP uzantısını çalıştırması gerektiğini yorumlayabilir. Hem istemcide hem de sunucuda çalışması gereken bir SOAP uzantısı örneği, şifreleme SOAP uzantısıdır. Şifreleme SOAP uzantısı yalnızca sunucuda çalışıyorsa ve dönüş değerlerini istemciye geri göndermeden önce şifrelerse, SOAP iletisinin şifresini çözmek için istemcinin SOAP uzantısını çalıştırması gerekir. Aksi takdirde, istemci dönüş değerini işleyemez.

Hizmet açıklaması biçim uzantısı oluşturmak için aşağıdaki adımları kullanın:

  1. öğesinden ServiceDescriptionFormatExtensiontüretilen bir sınıf oluşturun.

  2. sınıfına bir XmlFormatExtensionAttribute uygulayın ve hizmet açıklaması biçim uzantısının çalıştırılması gereken uzantı noktalarını belirtin.

  3. İsteğe bağlı olarak, sınıfına bir XmlFormatExtensionPointAttribute uygulayın ve sınıfı içinde yeni bir uzantı noktası işlevi gören bir üye belirtin.

  4. İsteğe bağlı olarak sınıfına bir XmlFormatExtensionPrefixAttribute uygulayın ve hizmet açıklaması biçim uzantısı tarafından oluşturulan XML öğeleriyle ilişkilendirilecek XML ad alanı ön ekini belirtin.

  5. Hizmet açıklaması biçim uzantısını yapılandırma dosyasının serviceDescriptionFormatExtensionTypes bölümünde çalışacak şekilde yapılandırın.

Oluşturucular

XmlFormatExtensionAttribute()

XmlFormatExtensionAttribute sınıfının yeni bir örneğini başlatır.

XmlFormatExtensionAttribute(String, String, Type)

Belirtilen uzantı noktasında çalışırken eklenecek XML öğesini ve ad alanını belirten sınıfının yeni bir örneğini XmlFormatExtensionAttribute başlatır.

XmlFormatExtensionAttribute(String, String, Type, Type)

Belirtilen uzantı noktalarında çalışırken eklenecek XML öğesini ve ad alanını belirten sınıfının yeni bir örneğini XmlFormatExtensionAttribute başlatır.

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

Belirtilen uzantı noktalarında çalışırken eklenecek XML öğesini ve ad alanını belirten sınıfının yeni bir örneğini XmlFormatExtensionAttribute başlatır.

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

Belirtilen uzantı noktalarında çalışırken eklenecek XML öğesini ve ad alanını belirten sınıfının yeni bir örneğini XmlFormatExtensionAttribute başlatır.

XmlFormatExtensionAttribute(String, String, Type[])

Belirtilen uzantı noktalarında çalışırken eklenecek XML öğesini ve ad alanını belirten sınıfının yeni bir örneğini XmlFormatExtensionAttribute başlatır.

Özellikler

ElementName

Hizmet açıklaması biçim uzantısı tarafından hizmet açıklamasına eklenen XML öğesini alır veya ayarlar.

ExtensionPoints

Hizmet açıklaması biçim uzantısının çalıştırıldığı aşamalar.

Namespace

Hizmet açıklaması biçim uzantısı tarafından hizmet açıklamasına eklenen XML öğesinin XML ad alanını alır veya ayarlar.

TypeId

Türetilmiş bir sınıfta uygulandığında, bu Attributeiçin benzersiz bir tanımlayıcı alır.

(Devralındığı yer: Attribute)

Yöntemler

Equals(Object)

Bu örneğin belirtilen bir nesneye eşit olup olmadığını gösteren bir değeri döndürür.

(Devralındığı yer: Attribute)
GetHashCode()

Bu örneğe ilişkin karma kodu döndürür.

(Devralındığı yer: Attribute)
GetType()

Type Geçerli örneğini alır.

(Devralındığı yer: Object)
IsDefaultAttribute()

Türetilmiş bir sınıfta geçersiz kılındığında, bu örneğin değerinin türetilmiş sınıf için varsayılan değer olup olmadığını gösterir.

(Devralındığı yer: Attribute)
Match(Object)

Türetilmiş bir sınıfta geçersiz kılındığında, bu örneğin belirtilen bir nesneye eşit olup olmadığını gösteren bir değer döndürür.

(Devralındığı yer: Attribute)
MemberwiseClone()

Geçerli Objectöğesinin sığ bir kopyasını oluşturur.

(Devralındığı yer: Object)
ToString()

Geçerli nesneyi temsil eden dizeyi döndürür.

(Devralındığı yer: Object)

Belirtik Arabirim Kullanımları

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

Bir ad kümesini karşılık gelen bir dağıtma tanımlayıcısı kümesine eşler.

(Devralındığı yer: Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Bir arabirimin tür bilgilerini almak için kullanılabilecek bir nesnenin tür bilgilerini alır.

(Devralındığı yer: Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Bir nesnenin sağladığı tür bilgisi arabirimlerinin sayısını alır (0 ya da 1).

(Devralındığı yer: Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Bir nesne tarafından sunulan özelliklere ve yöntemlere erişim sağlar.

(Devralındığı yer: Attribute)

Şunlara uygulanır

Ürün Sürümler
.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, 4.8.1
.NET Standard 2.0

Ayrıca bkz.