2013年3月15日 星期五

WCF Data Services 使用 JSON 格式

好久沒有使用 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]

寫入一兩筆料吧。

image

STEP2 EDMX

建立一個Empty ASP.NET application專案(使用 IIS,為了後面Fiddler 能錄到 json 格式)後,再建立一個  ado.net entity model,並且加入剛剛的 Table 作為測試的 Entity Set

image  image

並且,IIS 對應的 Application Pool 先改用 LocalSystem

SNAGHTML56e33f7

 

STEP3 建立 Data Service

建立一個名為 DemoWcfDataService.svc,並且修改對應的程式如下

SNAGHTML548f7d1

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 格式

image

但如果執行 http://localhost/DS5Service/DemoWcfDataService.svc/Users/?$format=json,則會回傳 400 的 http status code,意思就是不支援。

image

STEP4 更新成 DS 5.3

在專案上使用 NuGet,更新成 DS 5.3

SNAGHTML5559799

再執行一下相同的 URL, 就得到了 JSON格式的資料了

image

image

嗯!感覺真好。

STEP5 Client Side

那 Client side 如何取得 json 的資料呢?建立一個 Console Application ,並且 Add Service Reference,如下

SNAGHTML56307aa

程式如下

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

SNAGHTML57d15ae

接下來,要將 System.Data.Services.Client 移除,因為這已經被 Microsoft.Data.Services.Client 取代了

image

增加下面兩行程式,說明我們要使用 JSON 格式

context.Format.LoadServiceModel();
            context.Format.UseJson();

image

執行結果竟是:System.NullReferenceException: Object reference not set to an instance of an object.

image

STEP7 安裝 DS Tools 5.3

找到 WCF Data Services 5.3.0 RTM Tools Installer, 先關掉 Visual Studio 2012 後安裝 WcfDataServices.exe。

再打開solution,  刪除舊的 Service Reference,重新執行 STEP5 後,重新執行程式。就正常了 。

image

結論

使用 Fiddler 錄一下 Request / Response,使用JSON 格式的資料遠小於 xml 格式 (253 vs. 2044) 真的省好多哦!

image

Share with Facebook