Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сериализация XML — это базовый механизм транспорта, используемый в архитектуре веб-служб XML, выполняемой классом XmlSerializer . Чтобы управлять XML-кодом, созданным веб-службой XML, можно применить атрибуты, перечисленные в обоих атрибутах, которые управляют сериализацией XML иатрибутами, которые управляют сериализацией SOAP в классах, возвращаемых значениях, параметрах и полях файла, используемого для создания веб-службы XML (asmx). Дополнительные сведения о создании веб-службы XML см. в веб-службах XML с помощью ASP.NET.
Литеральные и кодированные стили
XML-код, созданный веб-службой XML, можно отформатировать одним из двух способов, как описано в разделе "Настройка форматирования сообщений SOAP". Поэтому существует два набора атрибутов, которые управляют сериализацией XML. Атрибуты, перечисленные в атрибутах, которые управляют XML-сериализацией, предназначены для управления XML-стилем литерала. Атрибуты, перечисленные в атрибутах, которые управляют кодировкой сериализации SOAP , определяют стиль в кодировке. Выборочно применяя эти атрибуты, вы можете настроить приложение для возврата или обоих стилей. Кроме того, эти атрибуты можно применять (по мере необходимости) для возврата значений и параметров.
Пример использования обоих стилей
При создании веб-службы XML можно использовать оба набора атрибутов в методах. В следующем примере кода класс с именем MyService
содержит два метода веб-службы XML и MyLiteralMethod
MyEncodedMethod
. Оба метода выполняют одну и ту же функцию: возврат экземпляра Order
класса. В классе Order
атрибуты XmlTypeAttribute и SoapTypeAttribute оба применяются к полю OrderID
, и оба атрибута имеют свойство ElementName
, установленное на разные значения.
Чтобы запустить пример, вставьте код в файл с расширением ASMX и поместите файл в виртуальный каталог, управляемый службами IIS. В веб-браузере введите имя компьютера, виртуального каталога и файла.
<%@ 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
. Имя элемента изменяется на "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
. Имя элемента — 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>
Применение атрибутов к возвращаемым значениям
Можно также применить атрибуты для возврата значений для управления пространством имен, именем элемента и т. д. В следующем примере кода атрибут XmlElementAttribute
применяется к значению, которое возвращает метод MyLiteralMethod
. Это позволяет управлять пространством имен и именем элемента.
<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, похожий на следующий код.
<?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>
Атрибуты, примененные к параметрам
Вы также можете применить атрибуты к параметрам, чтобы указать пространство имен, имя элемента и т. д. В следующем примере кода добавляется параметр в MyLiteralMethodResponse
метод и применяется XmlAttributeAttribute
атрибут к параметру. Имя элемента и пространство имен задаются для параметра.
<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 будет выглядеть следующим образом.
<?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>
Применение атрибутов к классам
Если необходимо управлять пространством имен элементов, которые коррелируют с классами, можно применить XmlTypeAttribute
XmlRootAttribute
и SoapTypeAttribute
при необходимости. В следующем примере кода применяются все три к классу Order
.
<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;
}
Результаты применения XmlTypeAttribute
и SoapTypeAttribute
можно увидеть при проверке описания службы, как показано в следующем примере кода.
<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>
Эффект XmlRootAttribute
также можно увидеть в результатах HTTP GET и HTTP POST.
<?xml version="1.0" encoding="utf-8"?>
<BookOrderForm xmlns="http://tempuri.org/">
<LiteralOrderID>string</LiteralOrderID>
</BookOrderForm>
См. также
- Сериализация XML и SOAP
- Атрибуты, управляющие сериализацией в кодировке SOAP
- Практическое руководство. Сериализация объекта в виде потока XML SOAP-Encoded
- Практическое руководство. Переопределение сериализации XML в кодировке SOAP
- Введение в сериализацию XML
- Практическое руководство. Сериализация объекта
- Практическое руководство. Десериализация объекта