XML-serialisering med XML Web Services
XML-serialisering är den underliggande transportmekanismen som används i XML-webbtjänstarkitekturen XmlSerializer , som utförs av klassen. Om du vill styra XML-koden som genereras av en XML-webbtjänst kan du använda attributen som anges i både Attribut som styr XML-serialisering och attribut som styr kodad SOAP-serialisering för klasserna, returnera värden, parametrar och fält i en fil som används för att skapa en XML-webbtjänst (.asmx). Mer information om hur du skapar en XML-webbtjänst finns i XML-webbtjänster med ASP.NET.
Literala och kodade formatmallar
XML-koden som genereras av en XML-webbtjänst kan formateras på något av två sätt, antingen literal eller kodad, enligt beskrivningen i Anpassa SOAP-meddelandeformatering. Därför finns det två uppsättningar attribut som styr XML-serialisering. Attributen som anges i Attribut som styr XML-serialisering är utformade för att styra literalt XML-format. Attributen som anges i Attribut som styr kodad SOAP-serialisering styr det kodade formatet. Genom att selektivt tillämpa dessa attribut kan du skräddarsy ett program för att returnera antingen eller båda formatmallarna. Dessutom kan dessa attribut tillämpas (efter behov) för att returnera värden och parametrar.
Exempel på att använda båda formatmallarna
När du skapar en XML-webbtjänst kan du använda båda uppsättningarna attribut på metoderna. I följande kodexempel innehåller klassen med namnet MyService
två XML-webbtjänstmetoder och MyLiteralMethod
MyEncodedMethod
. Båda metoderna utför samma funktion: returnerar en instans av Order
klassen. Order
I klassen tillämpas attributen XmlTypeAttributeSoapTypeAttribute och på fältet, och båda attributen OrderID
har sin ElementName
egenskap inställd på olika värden.
Om du vill köra exemplet klistrar du in koden i en fil med ett .asmx-tillägg och placerar filen i en virtuell katalog som hanteras av IIS (Internet Information Services). Från en webbläsare skriver du namnet på datorn, den virtuella katalogen och filen.
<%@ 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;
}
}
I följande kodexempel anropas MyLiteralMethod
. Elementnamnet ändras till "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>
I följande kodexempel anropas MyEncodedMethod
. Elementnamnet är "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>
Använda attribut för att returnera värden
Du kan också använda attribut för att returnera värden för att styra namnområdet, elementnamnet och så vidare. I följande kodexempel tillämpas XmlElementAttribute
attributet på metodens MyLiteralMethod
returvärde. På så sätt kan du styra namnområdet och elementnamnet.
<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;
}
När den anropas returnerar koden XML som liknar följande.
<?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>
Attribut som tillämpas på parametrar
Du kan också använda attribut för parametrar för att ange namnområde, elementnamn och så vidare. I följande kodexempel läggs en parameter till i MyLiteralMethodResponse
metoden och attributet tillämpas XmlAttributeAttribute
på parametern. Både elementnamnet och namnområdet anges för parametern.
<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-begäran skulle likna följande.
<?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>
Tillämpa attribut på klasser
Om du behöver styra namnområdet för element som korrelerar med klasser kan du tillämpa XmlTypeAttribute
, XmlRootAttribute
och SoapTypeAttribute
, efter behov. Följande kodexempel gäller alla tre för Order
klassen.
<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;
}
Resultatet av att tillämpa XmlTypeAttribute
och SoapTypeAttribute
kan visas när du undersöker tjänstbeskrivningen, som du ser i följande kodexempel.
<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>
Effekten av XmlRootAttribute
kan också visas i HTTP GET- och HTTP POST-resultaten enligt följande.
<?xml version="1.0" encoding="utf-8"?>
<BookOrderForm xmlns="http://tempuri.org/">
<LiteralOrderID>string</LiteralOrderID>
</BookOrderForm>