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 MyLiteralMethod
MyEncodedMethod
. 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ć XmlTypeAttribute
odpowiednio przestrzeń nazw , XmlRootAttribute
i 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ż
- Serializacja XML i SOAP
- Atrybuty kontrolujące zakodowaną serializację SOAP
- Instrukcje: Serializacja obiektu jako kodowanego strumienia XML protokołu SOAP
- Instrukcje: Przesłanianie zakodowanej serializacji XML protokołu SOAP
- Wprowadzenie do serializacji XML
- Instrukcje: Serializacja obiektu
- Instrukcje: Deserializacja obiektu