Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La serializzazione XML è il meccanismo di trasporto sottostante utilizzato nell'architettura dei servizi Web XML, eseguito dalla XmlSerializer classe . Per controllare il codice XML generato da un servizio Web XML, è possibile applicare gli attributi elencati in entrambi gli attributi che controllano la serializzazione XML e gli attributi che controllano la serializzazione SOAP codificata alle classi, restituiscono valori, parametri e campi di un file utilizzato per creare un servizio Web XML (asmx). Per altre informazioni sulla creazione di un servizio Web XML, vedere Servizi Web XML tramite ASP.NET.
Stili letterali e codificati
Il codice XML generato da un servizio Web XML può essere formattato in uno dei due modi, ovvero un valore letterale o codificato, come illustrato in Personalizzazione della formattazione dei messaggi SOAP. Esistono pertanto due set di attributi che controllano la serializzazione XML. Gli attributi elencati in Attributi che controllano la serializzazione XML sono progettati per controllare il codice XML dello stile letterale. Gli attributi elencati in Attributi che controllano la serializzazione SOAP codificata controllano lo stile codificato. Applicando in modo selettivo questi attributi, è possibile personalizzare un'applicazione per restituire uno o entrambi gli stili. Inoltre, questi attributi possono essere applicati (in base alle esigenze) per restituire valori e parametri.
Esempio di utilizzo di entrambi gli stili
Quando si crea un servizio Web XML, è possibile usare entrambi i set di attributi nei metodi . Nell'esempio di codice seguente, la classe denominata MyService contiene due metodi del servizio Web XML, MyLiteralMethod e MyEncodedMethod. Entrambi i metodi eseguono la stessa funzione: restituendo un'istanza della Order classe .
Order Nella classe gli XmlTypeAttribute attributi e SoapTypeAttribute vengono applicati entrambi al OrderID campo e entrambi gli attributi hanno la proprietà ElementName impostata su valori diversi.
Per eseguire l'esempio, incollare il codice in un file con estensione asmx e inserire il file in una directory virtuale gestita da Internet Information Services (IIS). Da un Web browser digitare il nome del computer, della directory virtuale e del file.
<%@ 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;
}
}
Nell'esempio di codice seguente viene chiamato MyLiteralMethod. Il nome dell'elemento viene modificato in "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>
Nell'esempio di codice seguente viene chiamato MyEncodedMethod. Il nome dell'elemento è "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>
Applicazione di attributi ai valori restituiti
È anche possibile applicare attributi per restituire valori per controllare lo spazio dei nomi, il nome dell'elemento e così via. Nell'esempio di codice seguente viene applicato l'attributo XmlElementAttribute al valore restituito del MyLiteralMethod metodo . In questo modo è possibile controllare lo spazio dei nomi e il nome dell'elemento.
<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;
}
Quando viene richiamato, il codice restituisce codice XML simile al seguente.
<?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>
Attributi applicati ai parametri
È anche possibile applicare attributi ai parametri per specificare lo spazio dei nomi, il nome dell'elemento e così via. Nell'esempio di codice seguente viene aggiunto un parametro al MyLiteralMethodResponse metodo e viene applicato l'attributo XmlAttributeAttribute al parametro . Il nome dell'elemento e lo spazio dei nomi sono entrambi impostati per il parametro .
<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;
}
La richiesta SOAP sarà simile alla seguente.
<?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>
Applicazione di attributi alle classi
Se è necessario controllare lo spazio dei nomi degli elementi correlati alle classi, è possibile applicare XmlTypeAttribute, XmlRootAttributee SoapTypeAttribute, in base alle esigenze. Nell'esempio di codice seguente vengono applicati tutti e tre alla Order classe .
<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;
}
I risultati dell'applicazione di XmlTypeAttribute e SoapTypeAttribute possono essere visualizzati quando si esamina la descrizione del servizio, come illustrato nell'esempio di codice seguente.
<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>
L'effetto di XmlRootAttribute può essere visualizzato anche nei risultati HTTP GET e HTTP POST, come indicato di seguito.
<?xml version="1.0" encoding="utf-8"?>
<BookOrderForm xmlns="http://tempuri.org/">
<LiteralOrderID>string</LiteralOrderID>
</BookOrderForm>
Vedere anche
- Serializzazione XML e SOAP
- Attributi che controllano la serializzazione SOAP codificata
- Procedura: Serializzare un oggetto come flusso XML SOAP-Encoded
- Procedura: Eseguire l'override della serializzazione SOAP XML codificata
- Introduzione alla serializzazione XML
- Procedura: Serializzare un oggetto
- Procedura: Deserializzare un oggetto