XmlFormatExtensionPrefixAttribute クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
サービスの説明内でサービスの説明のフォーマット拡張用に使用する XML 名前空間と XML 名前空間プリフィックスを指定します。 このクラスは継承できません。
public ref class XmlFormatExtensionPrefixAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple=true)]
public sealed class XmlFormatExtensionPrefixAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple=true)>]
type XmlFormatExtensionPrefixAttribute = class
inherit Attribute
Public NotInheritable Class XmlFormatExtensionPrefixAttribute
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
注釈
サービス記述形式拡張機能は、ASP.NET を使用して作成された XML Web サービスに対してサービス記述を生成する方法を拡張します。 具体的には、サービス記述形式拡張機能によって、サービスの説明に XML 要素が追加されます。 これは、SOAP 拡張機能に関する情報がサービスの説明に含まれていないため、XML Web サービスのクライアント側とサーバー側の両方で実行するように SOAP 拡張機能が構築されている場合に便利です。 SOAP 拡張機能に関する情報をサービスの説明に追加すると、クライアントは特定の SOAP 拡張機能を実行する必要があると解釈できます。 クライアントとサーバーの両方で実行する必要がある SOAP 拡張機能の例として、暗号化 SOAP 拡張機能があります。 暗号化 SOAP 拡張機能がサーバーでのみ実行され、クライアントに戻す前に戻り値を暗号化する場合、クライアントは SOAP メッセージの暗号化を解除するために SOAP 拡張機能を実行している必要があります。 それ以外の場合、クライアントは戻り値を処理できません。
次の手順に従って、サービス記述形式の拡張機能をビルドします。
から ServiceDescriptionFormatExtension派生するクラスをビルドします。
クラスに を XmlFormatExtensionAttribute 適用し、サービス記述形式の拡張機能を実行する拡張ポイントを指定します。
必要に応じて、 クラスに を XmlFormatExtensionPointAttribute 適用し、新しい拡張ポイントとして機能するクラス内のメンバーを指定します。
必要に応じて、 クラスに を XmlFormatExtensionPrefixAttribute 適用し、サービス記述形式拡張機能によって生成される XML 要素に関連付ける XML 名前空間プレフィックスを指定します。
構成ファイルの セクション内で実行するようにサービス
serviceDescriptionFormatExtensionTypes
記述形式拡張機能を構成します。
コンストラクター
XmlFormatExtensionPrefixAttribute() |
XmlFormatExtensionPrefixAttribute クラスの新しいインスタンスを初期化します。 |
XmlFormatExtensionPrefixAttribute(String, String) |
サービスの説明のフォーマット拡張用の XML 名前空間と XML 名前空間プリフィックスを設定し、XmlFormatExtensionPrefixAttribute クラスの新しいインスタンスを初期化します。 |
プロパティ
Namespace |
サービスの説明のフォーマット拡張に関連付けられた XML 名前空間を取得または設定します。 |
Prefix |
サービスの説明のフォーマット拡張に関連付けられた XML 名前空間プリフィックスを取得または設定します。 |
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) |
適用対象
.NET