Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
- Serializacja XML i SOAP
- Atrybuty kontrolujące serializację zakodowaną przez protokół SOAP
- Instrukcje: serializowanie obiektu jako strumienia XML SOAP-Encoded
- Instrukcje: zastępowanie zakodowanej serializacji XML protokołu SOAP
- Wprowadzenie do serializacji XML
- Instrukcje: Serializacja obiektu
- Instrukcje: Deserializacja obiektu