Udostępnij za pośrednictwem


Serializacja XML za pomocą usług sieci Web XML

Serializacja XML to podstawowy mechanizm transportu używany w architekturze usług sieci Web XML wykonywany przez klasę XmlSerializer . Aby kontrolować kod XML wygenerowany przez usługę sieci Web XML, można zastosować atrybuty wymienione zarówno w atrybutach, które kontrolują serializację XML, jak i w atrybutach kontrolujących serializację zakodowaną w protokole SOAP do klas, wartości zwracanych, parametrów i pól pliku używanego do tworzenia usługi sieci Web XML (.asmx). Aby uzyskać więcej informacji na temat tworzenia usługi sieci Web XML, zobacz XML Web Services Using ASP.NET (Usługi sieci Web XML using ASP.NET).

Style literalne i zakodowane

Kod XML wygenerowany przez usługę sieci Web XML można sformatować na jeden z dwóch sposobów, literału lub kodowania, zgodnie z opisem w temacie Dostosowywanie formatowania komunikatów protokołu SOAP. W związku z tym istnieją dwa zestawy atrybutów kontrolujących serializacji XML. Atrybuty wymienione w Atrybutach, które kontrolują serializację XML są przeznaczone do kontrolowania stylu literału XML. Atrybuty wymienione w Atrybutach, które kontrolują zakodowaną serializację SOAP kontrolują zakodowany styl. Poprzez selektywne stosowanie tych atrybutów, można dostosować aplikację do zwracania jednego, drugiego lub obu stylów. Ponadto te atrybuty można zastosować (odpowiednio), aby zwracać wartości i parametry.

Przykład użycia obu stylów

Podczas tworzenia usługi sieci Web XML można użyć obu zestawów atrybutów w metodach. W poniższym przykładzie kodu klasa o nazwie MyService zawiera dwie metody dla usługi sieciowej XML: MyLiteralMethod oraz MyEncodedMethod. Obie metody wykonują tę samą funkcję: zwracając wystąpienie Order klasy. Order W klasie atrybuty XmlTypeAttribute i SoapTypeAttribute są oba stosowane do pola OrderID, a oba atrybuty mają swoją właściwość ElementName ustawioną na różne wartości.

Aby uruchomić przykład, wklej kod do pliku z rozszerzeniem asmx i umieść plik w katalogu wirtualnym zarządzanym przez usługi Internet Information Services (IIS). W przeglądarce internetowej wpisz nazwę komputera, katalogu wirtualnego i pliku.

<%@ 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;  
    }  
}  

Poniższy przykład kodu wywołuje metodę MyLiteralMethod. Nazwa elementu jest zmieniana na "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>  

Poniższy przykład kodu wywołuje metodę MyEncodedMethod. Nazwa elementu to "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>  

Stosowanie atrybutów do zwracanych wartości

Możesz również zastosować atrybuty, aby zwracać wartości, aby kontrolować przestrzeń nazw, nazwę elementu itd. Poniższy przykład kodu stosuje XmlElementAttribute atrybut do zwracanej MyLiteralMethod wartości metody. Dzięki temu można kontrolować przestrzeń nazw i nazwę elementu.

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

Po wywołaniu kod zwraca kod XML podobny do poniższego.

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

Atrybuty zastosowane do parametrów

Możesz również zastosować atrybuty do parametrów, aby określić przestrzeń nazw, nazwę elementu itd. Poniższy przykład kodu dodaje parametr do MyLiteralMethodResponse metody i stosuje XmlAttributeAttribute atrybut do parametru. Nazwa elementu i przestrzeń nazw są ustawione dla parametru .

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

Żądanie protokołu SOAP będzie podobne do następującego.

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

Stosowanie atrybutów do klas

Jeśli musisz kontrolować przestrzeń nazw elementów skorelowanych z klasami, możesz zastosować XmlTypeAttribute, XmlRootAttribute i SoapTypeAttribute według uznania. Poniższy przykład kodu stosuje wszystkie trzy do Order klasy.

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

Wyniki zastosowania XmlTypeAttribute i SoapTypeAttribute można zobaczyć podczas badania opisu usługi, jak pokazano w poniższym przykładzie kodu.

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

Efekt działania XmlRootAttribute można również zauważyć w wynikach HTTP GET i HTTP POST.

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

Zobacz także