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

XML シリアル化は、XML Web サービス アーキテクチャで使用される基礎的なトランスポート機構であり、XmlSerializer クラスによって実行されます。XML serialization is the underlying transport mechanism used in the XML Web services architecture, performed by the XmlSerializer class. XML Web サービスによって生成される XML を制御するには、「XML シリアル化を制御する属性」および「エンコード済み SOAP シリアル化を制御する属性」の一覧に示されている属性を、XML Web サービスの作成に使用するファイル (.asmx) のクラス、戻り値、パラメーター、およびフィールドに適用します。To control the XML generated by an XML Web service, you can apply the attributes listed in both Attributes That Control XML Serialization and Attributes That Control Encoded SOAP Serialization to the classes, return values, parameters, and fields of a file used to create an XML Web service (.asmx). XML Web サービスを作成する方法の詳細については、次を参照してください。 XML Web サービスを使用して ASP.NETします。For more information about creating an XML Web service, see XML Web Services Using ASP.NET.

リテラル スタイルとエンコード済みスタイルLiteral and Encoded Styles

XML Web サービスによって生成された XML を 2 つの方法では、リテラルのいずれかで書式設定されたかで説明したように、エンコードされたSOAP メッセージの書式設定をカスタマイズするします。The XML generated by an XML Web service can be formatted in either one of two ways, either literal or encoded, as explained in Customizing SOAP Message Formatting. このため、XML シリアル化を制御する属性セットは 2 つになります。Therefore there are two sets of attributes that control XML serialization. XML シリアル化を制御する属性」の一覧に示される属性は、リテラル スタイルの XML を制御するように設計されています。The attributes listed in Attributes That Control XML Serialization are designed to control literal style XML. 一方、「エンコード済み SOAP シリアル化を制御する属性」の一覧に示される属性は、エンコード済みスタイルを制御します。The attributes listed in Attributes That Control Encoded SOAP Serialization control the encoded style. これらの属性を選択的に適用することで、2 つのスタイルのいずれかまたは両方を返すようにアプリケーションを調整できます。By selectively applying these attributes, you can tailor an application to return either, or both styles. さらに、これらの属性は、必要に応じて戻り値やパラメーターにも適用できます。Furthermore, these attributes can be applied (as appropriate) to return values and parameters.

両方のスタイルの使用例Example of Using Both Styles

XML Web サービスを作成する場合、両方の属性セットをメソッドで使用できます。When you're creating an XML Web service, you can use both sets of attributes on the methods. 次のコード例では、MyService という名前のクラスに、MyLiteralMethodMyEncodedMethod という 2 つの XML Web サービス メソッドが含まれています。In the following code example, the class named MyService contains two XML Web service methods, MyLiteralMethod and MyEncodedMethod. いずれのメソッドも、Order クラスのインスタンスを返すという同じ機能を実行します。Both methods perform the same function: returning an instance of the Order class. Order クラスでは、XmlTypeAttribute 属性と SoapTypeAttribute 属性の両方が OrderID フィールドに適用され、両方の属性の ElementName プロパティには異なる値が設定されます。In the Order class, the XmlTypeAttribute and the SoapTypeAttribute attributes are both applied to the OrderID field, and both attributes have their ElementName property set to different values.

この例を実行するには、拡張子 .asmx のファイルにコードを貼り付け、そのファイルをインターネット インフォメーション サービス (IIS) によって管理される仮想ディレクトリに配置して、To run the example, paste the code into a file with an .asmx extension, and place the file into a virtual directory managed by Internet Information Services (IIS). Internet Explorer などの HTML ブラウザーから、コンピューター名、仮想ディレクトリ名、およびファイル名を入力します。From an HTML browser, such as Internet Explorer, type the name of the computer, virtual directory, and file.

<%@ 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 を呼び出すコード例を次に示します。The following code example calls MyLiteralMethod. 要素名は "LiteralOrderID" に変更されています。The element name is changed to "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 を呼び出すコード例を次に示します。The following code example calls MyEncodedMethod. 要素名は "EncodedOrderID" です。The element name is "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>  

戻り値への属性の適用Applying Attributes to Return Values

属性を戻り値に適用して、名前空間や要素名などを制御することもできます。You can also apply attributes to return values to control the namespace, element name, and so forth. 次のコード例では、XmlElementAttribute 属性を MyLiteralMethod メソッドの戻り値に適用しています。The following code example applies the XmlElementAttribute attribute to the return value of the MyLiteralMethod method. このように属性を適用すると、名前空間や要素名を制御できます。Doing so allows you to control the namespace and element name.

<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 が返されます。When invoked, the code returns XML that resembles the following.

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

パラメーターに適用される属性Attributes Applied to Parameters

属性をパラメーターに適用して、名前空間や要素名などを指定することもできます。You can also apply attributes to parameters to specify namespace, element name and so forth. 次のコード例では、MyLiteralMethodResponse メソッドにパラメーターを追加し、そのパラメーターに XmlAttributeAttribute 属性を適用しています。The following code example adds a parameter to the MyLiteralMethodResponse method, and applies the XmlAttributeAttribute attribute to the parameter. パラメーターに対して、要素名と名前空間の両方が設定されます。The element name and namespace are both set for the parameter.

<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 要求は、次のようになります。The SOAP request would resemble the following.

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

クラスへの属性の適用Applying Attributes to Classes

クラスと相関関係を持つ要素の名前空間を制御する必要がある場合は、必要に応じて XmlTypeAttributeXmlRootAttribute、および SoapTypeAttribute を適用します。If you need to control the namespace of elements that correlate to classes, you can apply XmlTypeAttribute, XmlRootAttribute, and SoapTypeAttribute, as appropriate. 次のコード例では、3 つの属性すべてを Order クラスに適用しています。The following code example applies all three to the Order class.

<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 を適用した結果は、サービスの説明を調べると確認できます。The results of applying the XmlTypeAttribute and SoapTypeAttribute can be seen when you examine the service description, as shown in the following code example.

    <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 の結果から確認できます。The effect of the XmlRootAttribute can also be seen in the HTTP GET and HTTP POST results, as follows.

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

関連項目See also