Serializacja XML z usługami internetowymi XML

Serializacji XML jest źródłowego transportu mechanizm używany w architekturze usług sieci Web XML przez XmlSerializer klasy. Aby kontrolować kod XML wygenerowany przez usługę sieci Web XML, można zastosować atrybuty wymienione w obu atrybutach, które kontrolują serializację XML XML i atrybuty kontrolujące zakodowaną serializacji protokołu SOAP do klas, zwracać wartości, parametry i pola 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).

Literał i zakodowany stylów

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. Dlatego są dwóch zestawów atrybutów, które kontrolują serializacji XML. Atrybuty wymienione w atrybutach, które kontrolują serializacji XML, są przeznaczone do kontrolowania kodu XML stylu literału. Atrybuty wymienione w atrybutach, które kontrolują zakodowaną serializacji PROTOKOŁU SOAP, kontrolują zakodowany styl. Stosując selektywnie te atrybuty, można dostosować aplikację do zwracania stylów lub obu tych 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 na metody. W poniższym przykładzie kodu klasa o nazwie MyService zawiera dwie metody usługi sieci Web XML i MyLiteralMethodMyEncodedMethod. Obie metody wykonywania tej samej funkcji: zwrócenia wystąpienia Order klasy. Order W klasie XmlTypeAttribute atrybuty i SoapTypeAttribute są stosowane do OrderID pola, a oba atrybuty mają ich ElementName właściwość 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 jest "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. Ten sposób pozwala na kontrolowanie nazwa przestrzeni nazw i 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 XML, podobny 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>  
        <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 przestrzeni 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 wyglądać w następujący sposób.

<?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ć XmlTypeAttributeodpowiednio przestrzeń nazw , XmlRootAttributei SoapTypeAttribute. 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 elementu 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 XmlRootAttribute również zostanie wyświetlona w wynikach HTTP GET i HTTP POST w następujący sposób.

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

Zobacz też