XML Web Hizmetleri ile XML Serileştirme

XML serileştirme, XML Web hizmetleri mimarisinde kullanılan ve sınıfı tarafından gerçekleştirilen temel aktarım mekanizmasıdır XmlSerializer . XML Web hizmeti tarafından oluşturulan XML'yi denetlemek için, hem XML Serileştirmesini Denetleen Öznitelikler hem de Kodlanmış SOAP Serileştirmesini Denetleen Öznitelikler'de listelenen öznitelikleri, XML Web hizmeti (.asmx) oluşturmak için kullanılan bir dosyanın sınıflarına, değerlerine, parametrelerine ve alanlarına uygulayabilirsiniz. XML Web hizmeti oluşturma hakkında daha fazla bilgi için bkz . ASP.NET Kullanan XML Web Hizmetleri.

Değişmez değer ve kodlanmış stilleri

BIR XML Web hizmeti tarafından oluşturulan XML, SOAP İleti Biçimlendirmesini Özelleştirme bölümünde açıklandığı gibi sabit veya kodlanmış olmak üzere iki yoldan biriyle biçimlendirilebilir. Bu nedenle, XML serileştirmeyi denetleen iki öznitelik kümesi vardır. XML Serileştirmesini Denetleen Öznitelikler'de listelenen öznitelikler değişmez stil XML'sini denetlemek için tasarlanmıştır. Kodlanmış SOAP Serileştirmeyi Denetleen Öznitelikler'de listelenen öznitelikler kodlanmış stili denetler. Bu öznitelikleri seçmeli olarak uygulayarak, bir uygulamayı stilleri veya her ikisini de döndürecek şekilde uyarlayabilirsiniz. Ayrıca, bu öznitelikler (uygun şekilde) değerleri ve parametreleri döndürmek için uygulanabilir.

Her iki stil kullanarak örneği

XML Web hizmeti oluştururken, yöntemlerde her iki öznitelik kümesini de kullanabilirsiniz. Aşağıdaki kod örneğinde adlı sınıfı MyService iki XML Web hizmeti yöntemlerini içeren MyLiteralMethod ve MyEncodedMethod. Her iki yöntem aynı işlevi gerçekleştirmek: örneği döndüren Order sınıfı. Order sınıfında ve SoapTypeAttributeXmlTypeAttribute özniteliklerinin her ikisi de alana uygulanır OrderID ve her iki özniteliğin ElementName de özelliği farklı değerlere ayarlanmıştır.

Örneği çalıştırmak için bir dosya uzantısı olan bir .asmx kodu yapıştırın ve Internet Information Services (IIS) tarafından yönetilen bir sanal dizin dosyası yerleştirin. Bir web tarayıcısından bilgisayarın, sanal dizinin ve dosyanın adını yazın.

<%@ 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;  
    }  
}  

Aşağıdaki kod örneği çağrıları MyLiteralMethod. Öğe adı "LiteralOrderID için" değiştirilir.

<?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>  

Aşağıdaki kod örneği çağrıları MyEncodedMethod. Öğe adı "EncodedOrderID" dir.

<?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>  

Dönüş Değerlerine Öznitelik Uygulama

Ad alanını, öğe adını vb. denetlemek için değer döndürmek için öznitelikler de uygulayabilirsiniz. Aşağıdaki kod örneği, yönteminin XmlElementAttribute dönüş değerine özniteliğini MyLiteralMethod uygular. Bunu yaptığınızda ad alanı ve öğe adı denetlenmesini sağlar.

<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;  
}  

Çağrıldığında, aşağıdakine benzer XML kodu döndürür.

<?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>  

Parametrelere Uygulanan Öznitelikler

Ad alanı, öğe adı vb. belirtmek için parametrelere öznitelikler de uygulayabilirsiniz. Aşağıdaki kod örneği yöntemine MyLiteralMethodResponse bir parametre ekler ve özniteliğini parametresine uygular XmlAttributeAttribute . Öğe adı ve ad alanı her iki parameTRe için kümesidir.

<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 isteği aşağıdakine benzer.

<?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>  

Sınıflara Öznitelik Uygulama

Sınıflar ile bağıntılı öğelerin ad alanını denetlemeniz gerekiyorsa, uygun şekilde , XmlRootAttributeve SoapTypeAttributeuygulayabilirsinizXmlTypeAttribute. Aşağıdaki kod örneği için üç uygular Order sınıfı.

<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;  
}  

Uygulama sonuçlarını XmlTypeAttribute ve SoapTypeAttribute olduğunda, hizmet açıklamasını inceleyin aşağıdaki kod örneğinde gösterildiği gibi görülebilir.

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

Etkisini XmlRootAttribute Ayrıca HTTP GET ve HTTP POST sonuçları gibi görülebilir.

<?xml version="1.0" encoding="utf-8"?>  
<BookOrderForm xmlns="http://tempuri.org/">  
    <LiteralOrderID>string</LiteralOrderID>  
</BookOrderForm>  

Ayrıca bkz.