好久沒有使用 WCF Data Services 了。
這次 Demo 時,意外發現 WCF Data Services 在 5.3 時(其實更早)已經內建支援 JSON 格式,只是瀏覽器上不太容易試出來。下面,我們就一步步寫出來吧!
STEP1 資料
找一個資料庫吧。我使用 VS2012,隨便開一個 SQL Server (不能是 LocalDB,否則掛在 IIS 上會有問題)。
CREATE TABLE [dbo].[Users]( [EmpNo] [char](8) NOT NULL, [EmpName] [nvarchar](10) NOT NULL, [Password] [varchar](64) NOT NULL, CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ( [EmpNo] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
寫入一兩筆料吧。
STEP2 EDMX
建立一個Empty ASP.NET application專案(使用 IIS,為了後面Fiddler 能錄到 json 格式)後,再建立一個 ado.net entity model,並且加入剛剛的 Table 作為測試的 Entity Set
並且,IIS 對應的 Application Pool 先改用 LocalSystem
STEP3 建立 Data Service
建立一個名為 DemoWcfDataService.svc,並且修改對應的程式如下
public class DemoWcfDataService : DataService<DemoEntities> { public static void InitializeService(DataServiceConfiguration config) { config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3; } }
執行
http://localhost/DS5Service/DemoWcfDataService.svc/Users
果然是 xml 格式
但如果執行 http://localhost/DS5Service/DemoWcfDataService.svc/Users/?$format=json,則會回傳 400 的 http status code,意思就是不支援。
STEP4 更新成 DS 5.3
在專案上使用 NuGet,更新成 DS 5.3
再執行一下相同的 URL, 就得到了 JSON格式的資料了
嗯!感覺真好。
STEP5 Client Side
那 Client side 如何取得 json 的資料呢?建立一個 Console Application ,並且 Add Service Reference,如下
程式如下
static void Main(string[] args) { var context = new DemoEntities(new Uri("http://myhost/DS5Service/DemoWcfDataService.svc")); var users = context.Users; foreach (var user in users) Console.WriteLine(user.EmpName); }
程式可正常執行。但使用的並不是JSON 格式
STEP6 Client 更新成 DS 5.3
接下來,要將 System.Data.Services.Client 移除,因為這已經被 Microsoft.Data.Services.Client 取代了
增加下面兩行程式,說明我們要使用 JSON 格式
context.Format.LoadServiceModel();
context.Format.UseJson();
執行結果竟是:System.NullReferenceException: Object reference not set to an instance of an object.
STEP7 安裝 DS Tools 5.3
找到 WCF Data Services 5.3.0 RTM Tools Installer, 先關掉 Visual Studio 2012 後安裝 WcfDataServices.exe。
再打開solution, 刪除舊的 Service Reference,重新執行 STEP5 後,重新執行程式。就正常了 。
結論
使用 Fiddler 錄一下 Request / Response,使用JSON 格式的資料遠小於 xml 格式 (253 vs. 2044) 真的省好多哦!