XML シリアル化は、 XmlSerializer クラスによって実行される XML Web サービス アーキテクチャで使用される基になるトランスポート メカニズムです。 XML Web サービスによって生成される XML を制御するには、XML シリアル化を制御する 属性と 、エンコードされた SOAP シリアル化を制御する属性 の両方に、XML Web サービス (.asmx) の作成に使用されるファイルのクラス、戻り値、パラメーター、およびフィールドに一覧表示されている属性を適用できます。 XML Web サービスの作成の詳細については、「ASP.NET を使用した XML Web サービス」を参照してください。
リテラルスタイルとエンコードされたスタイル
XML Web サービスによって生成される XML は、「 SOAP メッセージの書式設定のカスタマイズ」で説明されているように、リテラルまたはエンコードの 2 つの方法のいずれかで書式設定できます。 したがって、XML シリアル化を制御する属性のセットは 2 つあります。 「 XML シリアル化を制御する属性 」に記載されている属性は、リテラル スタイルの XML を制御するように設計されています。 「 エンコードされた SOAP シリアル化を制御する属性 」に記載されている属性は、エンコードされたスタイルを制御します。 これらの属性を選択的に適用することで、いずれかのスタイルまたは両方のスタイルを返すようにアプリケーションを調整できます。 さらに、これらの属性を (必要に応じて) 適用して、値とパラメーターを返すことができます。
両方のスタイルを使用する例
XML Web サービスを作成する場合は、両方の属性セットをメソッドで使用できます。 次のコード例では、 MyService
という名前のクラスには、 MyLiteralMethod
と MyEncodedMethod
という 2 つの XML Web サービス メソッドが含まれています。 どちらのメソッドも同じ関数を実行します。 Order
クラスのインスタンスを返します。
Order
クラスでは、XmlTypeAttribute属性とSoapTypeAttribute属性の両方が OrderID
フィールドに適用され、両方の属性のElementName
プロパティが異なる値に設定されます。
この例を実行するには、.asmx 拡張子を持つファイルにコードを貼り付け、インターネット インフォメーション サービス (IIS) によって管理される仮想ディレクトリにファイルを配置します。 Web ブラウザーから、コンピューター、仮想ディレクトリ、およびファイルの名前を入力します。
<%@ WebService Language="VB" Class="MyService" %>
Imports System
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Xml.Serialization
Public Class Order
' Both types of attributes can be applied. Depending on which type
' the method used, either one will affect the call.
<SoapElement(ElementName:= "EncodedOrderID"), _
XmlElement(ElementName:= "LiteralOrderID")> _
public OrderID As String
End Class
Public Class MyService
<WebMethod, SoapDocumentMethod> _
public Function MyLiteralMethod() As Order
Dim myOrder As Order = New Order()
return myOrder
End Function
<WebMethod, SoapRpcMethod> _
public Function MyEncodedMethod() As Order
Dim myOrder As Order = New Order()
return myOrder
End Function
End Class
<%@ WebService Language="C#" Class="MyService" %>
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Serialization;
public class Order {
// Both types of attributes can be applied. Depending on which type
// the method used, either one will affect the call.
[SoapElement(ElementName = "EncodedOrderID")]
[XmlElement(ElementName = "LiteralOrderID")]
public String OrderID;
}
public class MyService {
[WebMethod][SoapDocumentMethod]
public Order MyLiteralMethod(){
Order myOrder = new Order();
return myOrder;
}
[WebMethod][SoapRpcMethod]
public Order MyEncodedMethod(){
Order myOrder = new Order();
return myOrder;
}
}
次のコード例では、 MyLiteralMethod
を呼び出します。 要素名が "LiteralOrderID" に変更されました。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<MyLiteralMethodResponse xmlns="http://tempuri.org/">
<MyLiteralMethodResult>
<LiteralOrderID>string</LiteralOrderID>
</MyLiteralMethodResult>
</MyLiteralMethodResponse>
</soap:Body>
</soap:Envelope>
次のコード例では、 MyEncodedMethod
を呼び出します。 要素名は "EncodedOrderID" です。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/" xmlns:types="http://tempuri.org/encodedTypes" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<tns:MyEncodedMethodResponse>
<MyEncodedMethodResult href="#id1" />
</tns:MyEncodedMethodResponse>
<types:Order id="id1" xsi:type="types:Order">
<EncodedOrderID xsi:type="xsd:string">string</EncodedOrderID>
</types:Order>
</soap:Body>
</soap:Envelope>
戻り値への属性の適用
属性を適用して値を返し、名前空間や要素名などを制御することもできます。 次のコード例では、XmlElementAttribute
メソッドの戻り値にMyLiteralMethod
属性を適用します。 これにより、名前空間と要素名を制御できます。
<WebMethod, SoapDocumentMethod> _
public Function MyLiteralMethod() As _
<XmlElement(Namespace:="http://www.cohowinery.com", _
ElementName:= "BookOrder")> _
Order
Dim myOrder As Order = New Order()
return myOrder
End Function
[return: XmlElement(Namespace = "http://www.cohowinery.com",
ElementName = "BookOrder")]
[WebMethod][SoapDocumentMethod]
public Order MyLiteralMethod(){
Order myOrder = new Order();
return myOrder;
}
呼び出されると、コードは次のような XML を返します。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<MyLiteralMethodResponse xmlns="http://tempuri.org/">
<BookOrder xmlns="http://www.cohowinery.com">
<LiteralOrderID>string</LiteralOrderID>
</BookOrder>
</MyLiteralMethodResponse>
</soap:Body>
</soap:Envelope>
パラメーターに適用される属性
パラメーターに属性を適用して、名前空間や要素名などを指定することもできます。 次のコード例では、 MyLiteralMethodResponse
メソッドにパラメーターを追加し、パラメーターに XmlAttributeAttribute
属性を適用します。 要素名と名前空間の両方がパラメーターに設定されます。
<WebMethod, SoapDocumentMethod> _
public Function MyLiteralMethod(<XmlElement _
("MyOrderID", Namespace:="http://www.microsoft.com")>ID As String) As _
<XmlElement(Namespace:="http://www.cohowinery.com", _
ElementName:= "BookOrder")> _
Order
Dim myOrder As Order = New Order()
myOrder.OrderID = ID
return myOrder
End Function
[return: XmlElement(Namespace = "http://www.cohowinery.com",
ElementName = "BookOrder")]
[WebMethod][SoapDocumentMethod]
public Order MyLiteralMethod([XmlElement("MyOrderID",
Namespace="http://www.microsoft.com")] string ID){
Order myOrder = new Order();
myOrder.OrderID = ID;
return myOrder;
}
SOAP 要求は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<MyLiteralMethod xmlns="http://tempuri.org/">
<MyOrderID xmlns="http://www.microsoft.com">string</MyOrderID>
</MyLiteralMethod>
</soap:Body>
</soap:Envelope>
クラスへの属性の適用
クラスに関連付ける要素の名前空間を制御する必要がある場合は、必要に応じて、 XmlTypeAttribute
、 XmlRootAttribute
、および SoapTypeAttribute
を適用できます。 次のコード例では、3 つすべてを Order
クラスに適用します。
<XmlType("BigBookService"), _
SoapType("SoapBookService"), _
XmlRoot("BookOrderForm")> _
Public Class Order
' Both types of attributes can be applied. Depending on which
' the method used, either one will affect the call.
<SoapElement(ElementName:= "EncodedOrderID"), _
XmlElement(ElementName:= "LiteralOrderID")> _
public OrderID As String
End Class
[XmlType("BigBooksService", Namespace = "http://www.cpandl.com")]
[SoapType("SoapBookService")]
[XmlRoot("BookOrderForm")]
public class Order {
// Both types of attributes can be applied. Depending on which
// the method used, either one will affect the call.
[SoapElement(ElementName = "EncodedOrderID")]
[XmlElement(ElementName = "LiteralOrderID")]
public String OrderID;
}
次のコード例に示すように、サービスの説明を調べると、 XmlTypeAttribute
と SoapTypeAttribute
を適用した結果が表示されます。
<s:element name="BookOrderForm" type="s0:BigBookService" />
<s:complexType name="BigBookService">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="LiteralOrderID" type="s:string" />
</s:sequence>
<s:schema targetNamespace="http://tempuri.org/encodedTypes">
<s:complexType name="SoapBookService">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="EncodedOrderID" type="s:string" />
</s:sequence>
</s:complexType>
</s:schema>
</s:complexType>
XmlRootAttribute
の効果は、次のように HTTP GET と HTTP POST の結果にも表示されます。
<?xml version="1.0" encoding="utf-8"?>
<BookOrderForm xmlns="http://tempuri.org/">
<LiteralOrderID>string</LiteralOrderID>
</BookOrderForm>
こちらも参照ください
.NET