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