Läs på engelska

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="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.

[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.

[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("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