XmlFormatExtensionPointAttribute Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Задает пространство имен XML и префикс пространства имен XML, используемые для расширения формата описания службы в описании службы. Этот класс не наследуется.
public ref class XmlFormatExtensionPointAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class)]
public sealed class XmlFormatExtensionPointAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class)>]
type XmlFormatExtensionPointAttribute = class
inherit Attribute
Public NotInheritable Class XmlFormatExtensionPointAttribute
Inherits Attribute
- Наследование
- Атрибуты
Примеры
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; }
}
}
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 = "http://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
Комментарии
Расширение формата описания службы расширяет способ создания описания службы для веб-службы XML, созданной с помощью ASP.NET. В частности, расширение формата описания службы добавляет XML-элементы в описание службы. Это полезно, если расширение SOAP создано для запуска как на стороне клиента, так и на стороне сервера веб-службы XML, так как сведения о расширениях SOAP не помещаются в описание службы автоматически. При добавлении сведений о расширении SOAP в описание службы клиент может интерпретировать, что он должен запустить определенное расширение SOAP. Примером расширения SOAP, которое должно выполняться как на клиенте, так и на сервере, является расширение SOAP для шифрования. Если расширение шифрования SOAP выполняется только на сервере и шифрует возвращаемые значения перед их отправкой клиенту, для расшифровки сообщения SOAP у клиента должно быть запущено расширение SOAP. В противном случае клиент не сможет обработать возвращаемое значение.
Чтобы создать расширение формата описания службы, выполните следующие действия.
Создайте класс, производный от ServiceDescriptionFormatExtension.
XmlFormatExtensionAttribute Примените к классу и укажите точки расширения, в которых должно выполняться расширение формата описания службы.
При необходимости примените XmlFormatExtensionPointAttribute к классу и укажите член в классе, который будет выступать в качестве новой точки расширения.
При необходимости примените XmlFormatExtensionPrefixAttribute к классу и укажите префикс пространства имен XML, который будет связан с XML-элементами, созданными расширением формата описания службы.
Настройте расширение формата описания службы для запуска в
serviceDescriptionFormatExtensionTypes
разделе файла конфигурации.
Конструкторы
XmlFormatExtensionPointAttribute(String) |
Инициализирует новый экземпляр класса XmlFormatExtensionPointAttribute. |
Свойства
AllowElements |
Возвращает или устанавливает значение, указывающее, может ли член класса, который реализует расширение формата описания службы, заданное свойством MemberName, использовать исходные элементы XML. |
MemberName |
Указывает, что с членом класса, реализующим расширение формата описания службы, может быть связано расширение формата описания службы. |
TypeId |
В случае реализации в производном классе возвращает уникальный идентификатор для этого атрибута Attribute. (Унаследовано от Attribute) |
Методы
Equals(Object) |
Возвращает значение, показывающее, равен ли экземпляр указанному объекту. (Унаследовано от Attribute) |
GetHashCode() |
Возвращает хэш-код данного экземпляра. (Унаследовано от Attribute) |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
IsDefaultAttribute() |
При переопределении в производном классе указывает, является ли значение этого экземпляра значением по умолчанию для производного класса. (Унаследовано от Attribute) |
Match(Object) |
При переопределении в производном классе возвращает значение, указывающее, является ли этот экземпляр равным заданному объекту. (Унаследовано от Attribute) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
Явные реализации интерфейса
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Сопоставляет набор имен соответствующему набору идентификаторов диспетчеризации. (Унаследовано от Attribute) |
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Возвращает сведения о типе объекта, которые можно использовать для получения сведений о типе интерфейса. (Унаследовано от Attribute) |
_Attribute.GetTypeInfoCount(UInt32) |
Возвращает количество предоставляемых объектом интерфейсов для доступа к сведениям о типе (0 или 1). (Унаследовано от Attribute) |
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Предоставляет доступ к открытым свойствам и методам объекта. (Унаследовано от Attribute) |