使用ASP.NET AJAX非同步呼叫Web Service和頁面中的類方法(10):伺服器端和用戶端資料類型的自動轉換:以XML方式序列化資料、小結

來源:互聯網
上載者:User

本文來自《ASP.NET AJAX程式設計 第II卷:用戶端Microsoft AJAX Library相關》的第三章《非同步呼叫Web Service和頁面中的類方法》,請同時參考本章的其他文章。

3.8 XML方式序列化資料

第2章中曾經提到過,ASP.NET AJAX非同步通訊層在傳遞資料時預設採用JSON序列化方式,但同時也提供給我們以XML方式進行序列化的選項。

一般來講,如果某Web Service方法的傳回值類型為XmlDocument或XmlElement的話,我們應該讓這類傳回值以XML方式進行序列化。例如如下的這個Web Service方法:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Xml)]
public XmlDocument GetXmlDocument()
{
    string theString = "<persons>"
        + "<person><name>Tom</name><age>30</age></person>"
        + "<person><name>Jerry</name><age>20</age></person>"
        + "</persons>";
    
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.LoadXml(theString);
 
    return xmlDoc;
}

注意上述代碼中的粗體部分,[ScriptMethod(ResponseFormat = ResponseFormat.Xml)]這個屬性就將該GetXmlDocument()方法傳回值的序列化方式設定為了XML。在用戶端的回呼函數中,返回的用戶端XML文檔對象在Visual Studio調試器中顯示出的結構3-36所示。

圖3-36 伺服器端XmlDocument類型在用戶端的結構

在用戶端得到返回的XML文檔對象之後,我們即可根據需求對其進行操作,限於篇幅,這裡不贅。

對於非XmlDocument或XmlElement的類型,如果我們願意,也可以選擇將其以XML的方式進行序列化。我們還是以前面定義的Employee類為例,如下Web Service方法就以XML序列化的方式返回一個Employee對象:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Xml)]
public Employee GetXMLFormatEmployee()
{
    return new Employee(
        12345,
        "Dflying",
        "Dflying@some.com",
        int.MaxValue
    );
}

同樣是為該方法應用了[ScriptMethod(ResponseFormat = ResponseFormat.Xml)]屬性(代碼中粗體部分),在用戶端回呼函數中,返回的JavaScript對象在Visual Studio調試器中顯示出的結構3-37所示。

圖3-37 以XML方式序列化的Employee對象的結構

可以看到,Employee對象被序列化成了如下XML字串:

<?xml version="1.0"?>
<Employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Id>12345</Id>
  <Name>Dflying</Name>
  <Email>Dflying@some.com</Email>
  <Salary>2147483647</Salary>
</Employee>

前面曾經提到過,為某個複雜類型中的某個屬性添加[System.Web.Script.Serialization.ScriptIgnore]屬性可以讓ASP.NET AJAX非同步通訊層在自動產生用戶端對象時忽略該屬性,不過這僅適用於預設的序列化方式,也就是JSON方式。

若希望在XML序列化方式中忽略某複雜物件的某屬性,那麼我們應該為該屬性添加[System.Xml.Serialization.XmlIgnore]屬性。我們還是以忽略Employee類中的Salary屬性為例,修改Employee類的實現代碼:

private int m_salary;
[System.Xml.Serialization.XmlIgnore]
public int Salary
{
    get { return m_salary; }
    set { m_salary = value; }
}

這時我們再次從用戶端調用GetXMLFormatEmployee()這個Web Service方法,將會看到Employee對象被序列化成了如下XML字串,其中沒有了<Salary />節點:

<?xml version="1.0"?>
<Employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Id>12345</Id>
  <Name>Dflying</Name>
  <Email>Dflying@some.com</Email>
</Employee>

若是某個Web Service方法的傳回值為字串類型,且該Web Service方法將使用XML方式序列化傳回值,那麼該字串將被預設為是一個XML文檔的片段,並已XML方式進行序列化。例如如下Web Service方法:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Xml)]
public string GetString()
{
    string theString = "<persons>"
        + "<person><name>Tom</name><age>30</age></person>"
        + "<person><name>Jerry</name><age>20</age></person>"
        + "</persons>";
 
    return theString;
}

在用戶端回呼函數中,返回的字串對象在Visual Studio調試器中顯示出的結構3-38所示,可以看到原本應該是一般字元串的內容被當成了XML片斷。

圖3-38 一般字元串的內容被預設當成了XML片斷處理

當然,ASP.NET AJAX做這樣的假設有它的道理,那就是字串可能實際上表示的就是一段XML資料。但是如果我們需要的就是一個普通的字串,那麼這樣做豈不是幫了倒忙嗎?

幸運的是,通過在[ScriptMethod]屬性中將XmlSerializeString指定為true,我們即可得到普通的字串,即避免了ASP.NET AJAX為我們做任何的自動轉換。讓我們按照如下代碼修改前面的GetString()方法,注意其中粗體部分:

[WebMethod]
 
[ScriptMethod(ResponseFormat = ResponseFormat.Xml, 
    XmlSerializeString = true)]
public string GetString()
{
    string theString = "<persons>"
        + "<person><name>Tom</name><age>30</age></person>"
        + "<person><name>Jerry</name><age>20</age></person>"
        + "</persons>";
 
    return theString;
}

這時在用戶端回呼函數中,返回的字串對象將被自動編碼並作為一般字元串傳遞,3-39中高亮部分所示。

圖3-39 以XML方式傳遞普通的字串資料

 

3.9 小結

ASP.NET AJAX非同步通訊層為我們在用戶端JavaScript中調用伺服器端Web Service或ASP.NET頁面中的類方法提供了極為便利的基礎設施,不但無需掌握任何具體的Ajax實現原理,甚至允許我們在JavaScript中直接用熟悉的、類似C#語言的文法來完成一次與伺服器的非同步通訊。

本章首先藉助一個簡單的樣本程式介紹了在用戶端通過ASP.NET AJAX非同步通訊層調用定義於Web Service中的方法的具體步驟,隨後又介紹了從用戶端調用定義於ASP.NET頁面中的類方法的流程,旨在讓讀者對ASP.NET AJAX非同步通訊層為伺服器端Web Service及ASP.NET頁面中類方法所產生的用戶端調用代理有一個初步的認識。

Web應用程式的運行有很多不確定性,從網路狀況的不穩定到開發人員的粗心大意,任何一個難以預料的問題均會讓某次非同步呼叫以失敗告終。本章隨後通過樣本程式介紹了在與伺服器進行非同步通訊時發生異常的處理方法。

為了在非同步呼叫的整個過程中維護必要的狀態資訊,ASP.NET AJAX所提供的非同步呼叫模型中包含了對傳遞使用者內容相關的支援。通過使用者內容物件,我們可以很容易地訪問到原始調用函數中的狀態。本章也介紹了這部分功能的實現方法。

隨後,本章詳細介紹了ASP.NET AJAX非同步通訊層為Web Service產生的用戶端非同步呼叫代理的功能,包括調用代理的完整文法、成功/失敗回呼函數的完整文法以及其他常用的屬性和設定。

在使用ASP.NET AJAX非同步通訊層對Web Service進行非同步呼叫時,預設採用的是HTTP POST方式。但為了提供足夠的靈活性,ASP.NET AJAX非同步通訊層同樣允許我們使用HTTP GET進行調用。本章隨後就介紹了採用HTTP GET進行調用的方法。

在用戶端與伺服器端以Ajax方式進行非同步互動時,ASP.NET AJAX非同步通訊層也提供了強大的伺服器端.NET類型和用戶端JavaScript類型之間自動轉換能力,我們只要略加配置,甚至根本不需要任何配置,即可在非同步通訊的過程中傳遞包括基本類型、枚舉類型、複雜類型、集合(包括泛型集合)類型、數群組類型等資料。這是本章中最為重要的內容,因此我們在這部分中給出了大量的樣本程式以及詳盡的分析,力求闡明傳遞上述類型的具體方法和注意事項。

ASP.NET AJAX非同步通訊層在傳遞資料時預設採用JSON序列化方式,但同時也提供給我們以XML方式進行序列化的選項。本章的最後介紹了讓XML作為用戶端和伺服器端互動時的資料傳遞格式的方法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.