Dela via


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 MyLiteralMethodMyEncodedMethod. 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, XmlRootAttributeoch 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>  

Se även