Share via


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

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

リテラル スタイルおよびエンコード済みスタイル

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

両方のスタイルを使用したコード例

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

このコード例を実行するには、コードを .asmx 拡張子の付いたファイルに貼り付け、そのファイルをインターネット インフォメーション サービス (IIS : Internet Information Services) によって管理される仮想ディレクトリに配置します。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 シリアル化