Aracılığıyla paylaş


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.

Literal ve Kodlanmış Stiller

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 Denetleyen Öznitelikler'de listelenen öznitelikler literal stil XML'yi denetlemek için tasarlanmıştır. Kodlanmış SOAP Serileştirmeyi Denetleen Öznitelikler'de listelenen öznitelikler kodlanmış stili denetler. Bu öznitelikleri özellikle uygulayarak, bir uygulamayı sadece bir stili veya her ikisini döndürecek şekilde uyarlayabilirsiniz. Ayrıca, bu öznitelikler (uygun şekilde) değerleri ve parametreleri döndürmek için uygulanabilir.

Her İki Stili Kullanma Örneği

XML Web hizmeti oluştururken, yöntemlerde her iki öznitelik kümesini de kullanabilirsiniz. Aşağıdaki kod örneğinde, MyService adlı sınıf, MyLiteralMethod ve MyEncodedMethod adlı iki XML Web hizmeti yöntemi içerir. Her iki yöntem de aynı işlevi gerçekleştirir: sınıfının bir örneğini Order döndürme. Order sınıfında, XmlTypeAttribute ve SoapTypeAttribute öznitelikleri OrderID alanına uygulanır, ve her iki özniteliğin ElementName özellikleri farklı değerlere ayarlanmıştır.

Örneği çalıştırmak için kodu .asmx uzantısına sahip bir dosyaya yapıştırın ve dosyayı Internet Information Services (IIS) tarafından yönetilen bir sanal dizine 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ısı yapar MyLiteralMethod. Öğe adı "LiteralOrderID" olarak 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ısı yapar MyEncodedMethod. Öğe adı "EncodedOrderID" şeklindedir.

<?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, XmlElementAttribute özniteliğini MyLiteralMethod yönteminin dönüş değerine uygular. Bunu yapmak, ad alanını ve öğe adını kontrol etmenizi 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;  
}  

Kod çağrıldığında, aşağıdakine benzer XML 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 MyLiteralMethodResponse yöntemine bir parametre ekler ve XmlAttributeAttribute özniteliğini parametreye uygular. Hem öğe adı hem de ad alanı parametresi için ayarlanır.

<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 olacaktı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>  
        <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ıflarla ilişkili öğelerin ad alanını kontrol etmeniz gerekiyorsa, uygun şekilde XmlTypeAttribute, XmlRootAttribute ve SoapTypeAttribute uygulayabilirsiniz. Aşağıdaki kod örneği üçünü de sınıfına Order uygular.

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

"XmlTypeAttribute ve SoapTypeAttribute sonuçları, hizmet açıklamasını incelediğinizde, 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>

'nin XmlRootAttribute etkisi HTTP GET ve HTTP POST sonuçlarında da aşağıdaki gibi görülebilir.

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

Ayrıca bakınız