XmlFormatExtensionAttribute-Klasse
Gibt an, dass eine Formaterweiterung der Dienstbeschreibung an einem oder an mehreren Erweiterungspunkten ausgeführt wird. Diese Klasse kann nicht geerbt werden.
Namespace: System.Web.Services.Configuration
Assembly: System.Web.Services (in system.web.services.dll)
Syntax
'Declaration
<AttributeUsageAttribute(AttributeTargets.Class)> _
Public NotInheritable Class XmlFormatExtensionAttribute
Inherits Attribute
'Usage
Dim instance As XmlFormatExtensionAttribute
[AttributeUsageAttribute(AttributeTargets.Class)]
public sealed class XmlFormatExtensionAttribute : Attribute
[AttributeUsageAttribute(AttributeTargets::Class)]
public ref class XmlFormatExtensionAttribute sealed : public Attribute
/** @attribute AttributeUsageAttribute(AttributeTargets.Class) */
public final class XmlFormatExtensionAttribute extends Attribute
AttributeUsageAttribute(AttributeTargets.Class)
public final class XmlFormatExtensionAttribute extends 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 sich nicht in der Dienstbeschreibung befinden. Wenn Sie der Dienstbeschreibung Informationen zur SOAP-Erweiterung hinzufügen möchten, 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:
Erstellen Sie eine Klasse, die von ServiceDescriptionFormatExtension abgeleitet ist.
Wenden Sie ein XmlFormatExtensionAttribute auf die Klasse an, und geben Sie die Erweiterungspunkte an, an denen die Formaterweiterung der Dienstbeschreibung ausgeführt werden soll.
Optional können Sie auch ein XmlFormatExtensionPointAttribute auf die Klasse anwenden und einen Member in der Klasse angeben, der als neuer Erweiterungspunkt fungiert.
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.
Konfigurieren Sie die Formaterweiterung der Dienstbeschreibung so, dass sie im serviceDescriptionFormatExtensionTypes-Abschnitt der Konfigurationsdatei ausgeführt wird.
Beispiel
Imports System
Imports System.Security.Permissions
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.IO
Imports System.Text
Imports System.Web.Services.Configuration
Imports System.Web.Services.Description
Imports System.Xml.Serialization
Imports System.CodeDom
' 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
Inherits SoapExtensionAttribute
Dim _priority As Integer = 0
Dim _disabled As Boolean = False
Public Sub New()
Me.New(False)
End Sub
Public Sub New(ByVal Disabled As Boolean)
_disabled = Disabled
End Sub
Public Overrides ReadOnly Property ExtensionType() As Type
Get
Return GetType(YMLExtension)
End Get
End Property
Public Overrides Property Priority() As Integer
Get
Return _priority
End Get
Set(ByVal Value As Integer)
_priority = Value
End Set
End Property
Public Property Disabled() As Boolean
Get
Return _disabled
End Get
Set(ByVal Value As Boolean)
_disabled = Value
End Set
End Property
End Class
Public Class YMLExtension
Inherits SoapExtension
Dim _disabled As Boolean = False
Dim oldStream As Stream
Dim newStream As Stream
Public Overloads Overrides Function GetInitializer( _
ByVal methodInfo As LogicalMethodInfo, _
ByVal attribute As SoapExtensionAttribute) As Object
Dim attr As YMLAttribute = attribute
If (Not attr Is Nothing) Then
Return attr.Disabled
End If
Return False
End Function
Public Overloads Overrides Function GetInitializer( _
ByVal WebServiceType As Type) As Object
Return False
End Function
Public Overrides Sub Initialize(ByVal initializer As Object)
If (TypeOf initializer Is Boolean) Then
_disabled = CBool(initializer)
End If
End Sub
Public Overrides Function ChainStream(ByVal streamref As Stream) As Stream
If (_disabled) Then
Return CType(Me, SoapExtension).ChainStream(streamref)
End If
oldStream = streamref
newStream = New MemoryStream()
Return newStream
End Function
Public Overrides Sub ProcessMessage(ByVal message As SoapMessage)
If (_disabled) Then Return
Select Case (message.Stage)
Case SoapMessageStage.BeforeSerialize
Encode(message)
Case SoapMessageStage.AfterSerialize
newStream.Position = 0
Reverse(newStream, oldStream)
Case SoapMessageStage.BeforeDeserialize
Decode(message)
Case SoapMessageStage.AfterDeserialize
End Select
End Sub
Sub Encode(ByRef message As SoapMessage)
message.ContentType = "text/yml"
End Sub
Sub Decode(ByVal message As SoapMessage)
If (message.ContentType <> "text/yml") Then
Throw New Exception("invalid content type:" & message.ContentType)
End If
Reverse(oldStream, newStream)
newStream.Position = 0
message.ContentType = "text/xml"
End Sub
Sub Reverse(ByVal source As Stream, ByVal dest As Stream)
Dim reader As TextReader = New StreamReader(source)
Dim writer As TextWriter = New StreamWriter(dest)
Dim line As String
line = reader.ReadLine()
While (Not line Is Nothing)
writer.WriteLine(StrReverse(line))
line = reader.ReadLine()
End While
writer.Flush()
End Sub
End Class
' 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
Inherits SoapExtensionReflector
Public Overrides Sub ReflectMethod()
Dim reflector As ProtocolReflector = ReflectionContext
Dim attr As YMLAttribute = _
reflector.Method.GetCustomAttribute(GetType(YMLAttribute))
' If the YMLAttribute has been applied to this XML Web service
' method, add the XML defined in the YMLOperationBinding class.
If (Not attr Is Nothing) Then
Dim yml As YMLOperationBinding = New YMLOperationBinding()
yml.Reverse = Not attr.Disabled
reflector.OperationBinding.Extensions.Add(yml)
End If
End Sub
End Class
' 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
Inherits SoapExtensionImporter
Public Overrides Sub ImportMethod( _
ByVal metadata As CodeAttributeDeclarationCollection)
Dim importer As SoapProtocolImporter = ImportContext
' Check whether the XML specified in the YMLOperationBinding is
' in the service description.
Dim yml As YMLOperationBinding = _
importer.OperationBinding.Extensions.Find( _
GetType(YMLOperationBinding))
If (Not yml Is Nothing) Then
' Only apply the YMLAttribute to the method when the XML
' should be reversed.
If (yml.Reverse) Then
Dim attr As CodeAttributeDeclaration = _
New CodeAttributeDeclaration(GetType(YMLAttribute).FullName)
attr.Arguments.Add( _
New CodeAttributeArgument(New CodePrimitiveExpression(True)))
metadata.Add(attr)
End If
End If
End Sub
End Class
' 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, _
GetType(OperationBinding)), _
XmlFormatExtensionPrefix("yml", YMLOperationBinding.YMLNamespace)> _
Public Class YMLOperationBinding
Inherits ServiceDescriptionFormatExtension
Private _reverse As Boolean
Public Const YMLNamespace As String = "https://www.contoso.com/yml"
<XmlElement("Reverse")> _
Public Property Reverse() As Boolean
Get
Return _reverse
End Get
Set(ByVal Value As Boolean)
_reverse = Value
End Set
End Property
End Class
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; }
}
}
import System.*;
import System.CodeDom.*;
import System.IO.*;
import System.Text.*;
import System.Web.Services.Configuration.*;
import System.Web.Services.Description.*;
import System.Web.Services.Protocols.*;
import 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.
/** @attribute AttributeUsage(AttributeTargets.Method, AllowMultiple = false)
*/
public class YMLAttribute extends SoapExtensionAttribute
{
private int priority = 0;
private boolean disabled = false;
public YMLAttribute()
{
this(false);
} //YMLAttribute
public YMLAttribute(boolean disabled)
{
this.disabled = disabled;
} //YMLAttribute
/** @property
*/
public Type get_ExtensionType()
{
return YMLExtension.class.ToType();
} //get_ExtensionType
/** @property
*/
public int get_Priority()
{
return priority;
} //get_Priority
/** @property
*/
public void set_Priority(int value)
{
priority = value;
} //set_Priority
/** @property
*/
public boolean get_Disabled()
{
return disabled;
} //get_Disabled
/** @property
*/
public void set_Disabled(boolean value)
{
disabled = value;
} //set_Disabled
} //YMLAttribute
public class YMLExtension extends SoapExtension
{
private boolean disabled = false;
private Stream oldStream;
private Stream newStream;
public Object GetInitializer(LogicalMethodInfo methodInfo,
SoapExtensionAttribute attribute)
{
YMLAttribute attr =(YMLAttribute)attribute;
if (attr != null) {
return (System.Boolean)attr.get_Disabled();
}
return (System.Boolean)false;
} //GetInitializer
public Object GetInitializer(Type serviceType)
{
return (System.Boolean)false;
} //GetInitializer
public void Initialize(Object initializer)
{
if (initializer instanceof Boolean) {
disabled = System.Convert.ToBoolean(initializer);
}
} //Initialize
public Stream ChainStream(Stream stream)
{
if (disabled) {
return super.ChainStream(stream);
}
oldStream = stream;
newStream = new MemoryStream();
return newStream;
} //ChainStream
public void ProcessMessage(SoapMessage message) throws Exception
{
if (disabled) {
return;
}
switch (message.get_Stage()) {
case SoapMessageStage.BeforeSerialize:
Encode(message);
break;
case SoapMessageStage.AfterSerialize:
newStream.set_Position(0);
Reverse(newStream, oldStream);
break;
case SoapMessageStage.BeforeDeserialize:
Decode(message);
break;
case SoapMessageStage.AfterDeserialize:
break;
}
} //ProcessMessage
void Encode(SoapMessage message)
{
message.set_ContentType("text/yml");
} //Encode
void Decode(SoapMessage message) throws Exception
{
if (!(message.get_ContentType()).Equals("text/yml")) {
throw new Exception("invalid content type:"
+ message.get_ContentType());
}
Reverse(oldStream, newStream);
newStream.set_Position(0);
message.set_ContentType("text/xml");
} //Decode
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.get_Length() - 1; i >= 0; i--) {
builder.Append(line.GetEnumerator().get_Current());
}
writer.WriteLine(builder.ToString());
}
writer.Flush();
} //Reverse
} //YMLExtension
// The YMLReflector class is part of the YML SDFE, as it is
// called during the service description generation process.
/** @attribute System.Security.Permissions.PermissionSet(System.Security.
Permissions.SecurityAction.Demand, Name = "FullTrust")
*/
public class YMLReflector extends SoapExtensionReflector
{
public void ReflectMethod()
{
ProtocolReflector reflector = get_ReflectionContext();
YMLAttribute attr = (YMLAttribute)(reflector.get_Method().
GetCustomAttribute(YMLAttribute.class.ToType()));
// 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.set_Reverse(new Boolean(!(attr.get_Disabled())));
//yml.set_Reverse( new Boolean(!(attr.get_Disabled())));
reflector.get_OperationBinding().get_Extensions().Add(yml);
}
} //ReflectMethod
} //YMLReflector
// 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.
/** @attribute System.Security.Permissions.PermissionSet(System.Security.
Permissions.SecurityAction.Demand, Name = "FullTrust")
*/
public class YMLImporter extends SoapExtensionImporter
{
public void ImportMethod(CodeAttributeDeclarationCollection metadata)
{
SoapProtocolImporter importer = get_ImportContext();
// Check whether the XML specified in the YMLOperationBinding
// is in the service description.
YMLOperationBinding yml = (YMLOperationBinding)(importer.
get_OperationBinding().get_Extensions().
Find(YMLOperationBinding.class.ToType()));
if (yml != null) {
// Only apply the YMLAttribute to the method when the XML should
// be reversed.
if (System.Boolean.Parse(yml.get_Reverse().ToString())) {
CodeAttributeDeclaration attr
= new CodeAttributeDeclaration(YMLAttribute.class.ToType().
get_FullName());
attr.get_Arguments().Add(new CodeAttributeArgument(new CodePrimitiveExpression((System.Boolean)true)));
metadata.Add(attr);
}
}
} //ImportMethod
} //YMLImporter
// 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.
/** @attribute XmlFormatExtension("action", YMLOperationBinding.YMLNamespace,
OperationBinding.class)
*/
/** @attribute XmlFormatExtensionPrefix("yml", YMLOperationBinding.YMLNamespace)
*/
public class YMLOperationBinding extends ServiceDescriptionFormatExtension
{
private Boolean reverse;
public final static String YMLNamespace = "https://www.contoso.com/yml";
/** @attribute XmlElement("Reverse")
*/
/** @property
*/
public Boolean get_Reverse()
{
return reverse;
} //get_Reverse
/** @property
*/
public void set_Reverse(Boolean value)
{
reverse = value;
} //set_Reverse
} //YMLOperationBinding
Vererbungshierarchie
System.Object
System.Attribute
System.Web.Services.Configuration.XmlFormatExtensionAttribute
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
XmlFormatExtensionAttribute-Member
System.Web.Services.Configuration-Namespace
ServiceDescriptionFormatExtension
XmlFormatExtensionAttribute-Klasse
XmlFormatExtensionPointAttribute
XmlFormatExtensionPrefixAttribute