上一節(jié)學習了WCF與AJAX編程開發(fā)實踐(3):支持ASP.NET AJAX的WCF服務。今天繼續(xù)學習WCF與AJAX編程開發(fā)實踐(4):支持JSON的AJAX WCF服務。 本文重點介紹的是如何在支持AJAX的WCF服務里使用JSON進行數(shù)據(jù)交換。這里會首先介紹JSON的基本概念,為了說明問題。我們會給出一個JSON的例子。中間介紹WCF的JSON編程模型,最后給出的是示例代碼。
首先我們來看一下JSON的定義。
【1】JSON:
JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,易于閱讀和編寫,同時也易于機器解析和生成。它基于ECMA262語言規(guī)范(1999-12第三版)中JavaScript 編程語言的一個子集。 JSON采用與編程語言無關(guān)的文本格式,但是也使用了類C語言(包括C, C++, C#, Java, JavaScript, Perl, Python等)的習慣,這些特性使JSON成為理想的數(shù)據(jù)交換格式。
【2】JSON例子:
【2.1】現(xiàn)在我們看一下JSONd數(shù)據(jù)結(jié)構(gòu)。JSON的結(jié)構(gòu)基于下面兩點:
JSON必須(MUST)是一個對象、數(shù)組、數(shù)字或字符串,或者是下面三個實字名之一:
實字名必須(MUST)是小寫的,且不允許有其它的實字名。
【2.2】我們可以定義一個User的代碼,JSON表示如下:
var user1= { “Name”:”Frank”, “Address”:”ShangHai”};
也可以定義一個對象的集合,JSON示例如下:
下面代碼演示了使用JSON形式定義這個用戶列表:
var userList = [
{ “Name”:”Frank”, “Address”:”ShangHai”},
{ “Name”:”Xu Lei”, “Address”:”BeiJing”},
]
【2.3】與XML比較:
我們知道。XML是可擴展置標語言(eXtensible Markup Language,簡稱XML),又稱可擴展標記語言。這與JSON有很大不同。雖然都是表示數(shù)據(jù)。JSON與XML最大的不同在于XML是一個完整的標記語言,而JSON不是。這使的XML在程序判讀上需要比較多的功夫。主要的原因在于XML的設計理念與JSON不同。XML利用標記語言的特性提供了絕佳的延展性(如XPath),而JSON的重點在于數(shù)據(jù)的交換。
【3】WCF 的JSON編程模型:
既然JSON與XML成為又一個標準的數(shù)據(jù)交換格式。那么WCF也對其進行了很好的支持?,F(xiàn)在我們來看看WCF的JSON編程模型。
我們知道WCF的Web編程模型已經(jīng)非常的完善,并且很好地支持了XML格式的數(shù)據(jù)交換。這里如果要對JSON支持,首先要做的就是對于數(shù)據(jù)對象的JSON序列化和反序列化。也就是Data Object—>JSON—>Data Object這樣的過程。
那么為了做好這一點,WCF提供了一個專門的序列化器,DataContractJsonSerializer 。來提供對于JSON數(shù)據(jù)的支持工作。
此序列化器的MSDN介紹如下:
可以使用 DataContractJsonSerializer 類將類型實例序列化為 JSON 文檔,并將 JSON 文檔反序列化為類型實例。例如,可以使用包含重要數(shù)據(jù)(如名稱和地址)的屬性創(chuàng)建一個名為 Person 的類型。然后,可以創(chuàng)建和操作一個 Person 類實例,并在 JSON 文檔中寫入所有其屬性值以便于以后檢索??呻S后將該 JSON 文檔反序列化為 Person 類,或者反序列化為另一個具有等效數(shù)據(jù)協(xié)定的類。如果在服務器上的傳出答復的序列化期間發(fā)生錯誤或答復操作由于某種其他原因引發(fā)異常,則可能不會將其作為錯誤返回到客戶端。
當然和DataContractSerializer一樣,DataContractJsonSerializer的工作也是出于WCF的背后。除非我們自己要控制序列化和反序列化過程。WCF里我們可以方便地定義數(shù)據(jù)類型,然后框架會根據(jù)我們設置的數(shù)據(jù)格式來確定使用那個序列化器。比如:RequestFormat=WebMessageFormat.Xml,ResponseFormat=WebMessageFormat.Json)
請求使用的是DataContractSerializer,而返回數(shù)據(jù)使用的是DataContractJsonSerializer。
【4】創(chuàng)建ASP.NET 網(wǎng)站:
下面的過程和上一節(jié)里的過程類似,也是主要包含,開發(fā)和測試WCF服務的過程。但是為了演示對于JSON的支持,我們這里部分服務方法和JS代碼做了修改。具體如下:
首先這里要求你安裝了Visual Studio2008 開發(fā)環(huán)境。
創(chuàng)建一個普通的ASP.NET 網(wǎng)站,步驟很簡單,也就是在New ->Web Site 選擇網(wǎng)站即可,如下圖所示:
【5】創(chuàng)建WCF Service:
【5.1】其次創(chuàng)建一個支持AJAX的WCF服務。
這里與之前的ASP.NET Web Service不同,我們需要自己創(chuàng)建一個支持AJAX的WCF Service即可,如圖所示:
【5.2】服務類定義:
AjaxWCFService服務類型定義了一個操作,和普通的WCF服務操作沒有區(qū)別,需要標注[OperationContract]。這個操作的代碼很簡單,就是接受一個name參數(shù),然后返回一個User。具體實現(xiàn)如下:
這里比較關(guān)鍵的一個服務屬性標注就是:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]應它的作用就是表示W(wǎng)CF服務能否在 ASP.NET 兼容模式下運行。我們這里設置為允許。
添加AjaxEnabledWCFService,Visual Studio會自動為我們加上這些標注。
【5.3】配置文件Web.Config:
Visual Studio會幫助我們添加一些重要的代碼和配置信息
【6】創(chuàng)建ASP.NET AJAX客戶端:
選擇我們需要一個客戶端,來調(diào)用WCF服務。
【6.1】這里創(chuàng)建ASP.NET AJAX客戶端,最重要的是要使用一個服務端控件ScriptManager。這個可以在ToolBox里找到。
它的作用很關(guān)鍵,上一節(jié)我們討論過。 ScriptManager 控件是 ASP.NET 中 AJAX 功能的中心。該控件可管理一個頁面上的所有 ASP.NET AJAX 資源。其中包括將 Microsoft AJAX Library 腳本下載到瀏覽器和協(xié)調(diào)通過使用 UpdatePanel 控件啟用的部分頁面更新。(更多內(nèi)容大家可以自己閱讀http://msdn.microsoft.com/zh-cn/library/system.web.ui.scriptmanager.aspx頁面的介紹)。
【6.2】HTML頁面設計,我們就沿用第二節(jié)里的頁面控件。基本不做修改。功能很簡單,和第二節(jié)一樣,我們輸入用戶名UserName,然后調(diào)用WCF服務,返回數(shù)據(jù)。
【6.3】 剩下的就是Javascript函數(shù),這個過程也非常的簡單,因為Visual Studio2008的腳本代碼編寫的提示也非常的方便,你可以方便地寫出一個完成的Javascript函數(shù),這里也可以使用Jquery。 代碼如下:
【7】運行結(jié)果:
這里我們可以直接在IE里測試一下效果,打開瀏覽器,瀏覽Default.aspx網(wǎng)頁,這個網(wǎng)頁里包含了我們調(diào)用WCF服務的客戶端Javascript腳本。
我們在控件里輸入姓名以后,點擊Search按鈕,就會看到調(diào)用WCF服務操作SayHello返回的結(jié)果。如圖所示:
【8】總結(jié):
JSON現(xiàn)在也成為大多數(shù)平臺支持的數(shù)據(jù)交換格式。變得日益重要。
Justin在《WCF技術(shù)內(nèi)幕》也提到過,雖然早期WCF開發(fā)團隊不是很確定JSON日后的地位,但是為其預留了很好的擴展空間。
現(xiàn)在任何跨平臺的數(shù)據(jù)交換,主要還是采用XML,而JSON作為輕量級數(shù)據(jù)交換格式,也越來越被其他平臺接受。很多公司的Developer職位要求熟悉XML的同時,對于JSON做出了要求。作為開發(fā)者簡單了解一下,也是必要的。
最后,我也給出本文的例子代碼,供各位參考:/Files/frank_xl/4.AjaxJSONWCFWebSite.zip。
參考資料:
2.WCF與AJAX編程開發(fā)實踐(1):AJAX基礎概念和純AJAX示例
3.WCF與AJAX編程開發(fā)實踐(2):支持ASP.NET AJAX的Web Service
4.WCF與AJAX編程開發(fā)實踐(3):支持ASP.NET AJAX的WCF服務
5.http://wowo.hztalk.com/?p=98
6.http://ssgemail.javaeye.com/blog/36776