XML Web サービスを使用した XML シリアル化

XML シリアル化は、XML Web サービス アーキテクチャで使用される基礎的なトランスポート機構であり、XmlSerializer クラスによって実行されます。XML Web サービスによって生成される XML を制御するには、「XML シリアル化を制御する属性」および「エンコード済み SOAP シリアル化を制御する属性」の一覧に示されている属性を、XML Web サービスの作成に使用するファイル (.asmx) のクラス、戻り値、パラメーター、およびフィールドに適用します。XML Web サービスの作成の詳細については、「Building XML Web Services Using ASP.NET」を参照してください。

リテラル スタイルとエンコード済みスタイル

XML Web サービスによって生成される XML は、「Customizing SOAP Messages」で説明されているリテラルおよびエンコード済みの 2 種類のうち、いずれかの形式を指定できます。このため、XML シリアル化を制御する属性セットは 2 つになります。「XML シリアル化を制御する属性」の一覧に示される属性は、リテラル スタイルの XML を制御するように設計されています。一方、「エンコード済み SOAP シリアル化を制御する属性」の一覧に示される属性は、エンコード済みスタイルを制御します。これらの属性を選択的に適用することで、2 つのスタイルのいずれかまたは両方を返すようにアプリケーションを調整できます。さらに、これらの属性は、必要に応じて戻り値やパラメーターにも適用できます。

両方のスタイルの使用例

XML Web サービスを作成する場合、両方の属性セットをメソッドで使用できます。次のコード例では、MyService という名前のクラスに、MyLiteralMethodMyEncodedMethod という 2 つの XML Web サービス メソッドが含まれています。いずれのメソッドも、Order クラスのインスタンスを返すという同じ機能を実行します。Order クラスでは、XmlTypeAttribute 属性と SoapTypeAttribute 属性の両方が OrderID フィールドに適用され、両方の属性の ElementName プロパティには異なる値が設定されます。

この例を実行するには、拡張子 .asmx のファイルにコードを貼り付け、そのファイルをインターネット インフォメーション サービス (IIS) によって管理される仮想ディレクトリに配置して、Internet Explorer などの HTML ブラウザーから、コンピューター名、仮想ディレクトリ名、およびファイル名を入力します。

<%@ 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="https://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="https://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/" xmlns:types="http://tempuri.org/encodedTypes" xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body soap:encodingStyle="https://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="https://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:="https://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="https://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="https://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <MyLiteralMethod xmlns="http://tempuri.org/">
            <MyOrderID xmlns="https://www.microsoft.com">string</MyOrderID>
        </MyLiteralMethod>
    </soap:Body>
</soap:Envelope>

クラスへの属性の適用

クラスと相関関係を持つ要素の名前空間を制御する必要がある場合は、必要に応じて XmlTypeAttributeXmlRootAttribute、および 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;
}

次のコード例に示すように、XmlTypeAttributeSoapTypeAttribute を適用した結果は、サービスの説明を調べると確認できます。

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

また、XmlRootAttribute を適用した結果も、次に示す HTTP GET と HTTP POST の結果から確認できます。

<?xml version="1.0" encoding="utf-8"?>
<BookOrderForm xmlns="http://tempuri.org/">
    <LiteralOrderID>string</LiteralOrderID>
</BookOrderForm>

参照

処理手順

方法 : オブジェクトを SOAP エンコード済み XML ストリームとしてシリアル化する
方法 : SOAP エンコード済み XML シリアル化をオーバーライドする
方法 : オブジェクトをシリアル化する
方法 : オブジェクトを逆シリアル化する

概念

エンコード済み SOAP シリアル化を制御する属性
XML シリアル化の概要

その他のリソース

XML シリアル化および SOAP シリアル化