顯示具有 WCF Data Service 標籤的文章。 顯示所有文章
顯示具有 WCF Data Service 標籤的文章。 顯示所有文章

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

2011年6月23日 星期四

WCF Data Service 的優缺點

最近一直與 WCF Data Service 打交道。也漸漸了解這個技術的優勢與缺點了。整理如下

優點1:RESTful

如果使用WCF來開發一個 CustomerService,就免不了如下的Method

AddCustomer(Customer customer);
DeleteCustomer(int id);
UpdateCustomer(Customer customer);
FindCustomers(string condition);

新刪修查,至少要發佈4個 Method。如果使用 WCF Data Service,只需要一個 Url 來定位即可。如果再使用 Entity Framework,更是方便。

優點2:WCF Data Service Client Library

使用 WCF Data Service Client Library 來查詢 OData的資料,可再進一步使用 LINQ 的語法來查詢資料。新增/刪除/修改資料時,更像是在操作 Entity Framework 一般的方便。見更新資料服務 (WCF Data Services)

優點3:跨平台

這個年代,服務不能跨平台,就沒有人要使用。因此,WCF Data Service 是非常簡單的 Url 定址,與 xml 純文字的回傳資料,再加上 HTTP 的 Verbs,即可完成簡單的操作。跨平台,是最大的賣點。看一下 oData SDK,各式各樣的平台與技術都被支援哦!

缺點1:查詢大都只能支援 HTTP Method = GET

WCF Data Service要查詢資料目前大都只支援 GET。當有大量資料要上傳到伺服器時,由於 HTTP GET 有 Url的長度限制(  通常為 8096 bytes),所以只好轉用 POST。但 WCF Data Service Client Library 支援 POST 的能力很差哦!連呼叫都必須使用 HttpWebRequestWebClient 來呼叫,相對來說實在很難用。

缺點2:支援LINQ 語法尚差

查詢資料服務 (WCF Data Services),初看之下看來很強悍,但 check LINQ 考量 (WCF Data Services) 中的「不支援的 LINQ 方法」一節,不支援的 LINQ 語法還真多。最常用的 JoinCount竟然也不支援,聲勢立即弱了下來。

缺點3:不適合大量資料上傳到伺服器

由於缺點1的關係,想要傳較多資料到伺服器時,就必須使用 WebInvoke 的 service operation。在Service Operation上,並不能使用類似 WCF Service 的 Stream 來讀取 POST 的資料。原因很簡單,因為 Stream 並無法自動發佈成 metadata。因此,如果要讀POST 的內容,必須使用 ASP.NET 的 HttpContext.Current.Request.Form 來讀取。因此程式碼就完全相依服 ASP.NET了。之後有空,就寫另一篇來介紹這個作法。

缺點4:只能跑 Http,不能跑 binary

RESTful 使用了 Url 來定址,新刪修查分別對應 POST, DELETE, PUT,GET等 HTTP Method(Verbs),所在只能跑 http 的 protocal,無法跑 binary 來傳資料。傳輸資料量變大後,效能就會比較差。幸好, IIS 有動態壓縮的功能,可以有效減少傳輸的資料量。

結論

看起來好像缺點比優點多一些,但是,跨平台卻是相當大的優勢。未來是 HTML5的世界,WCF Data Service 一定大有可為。

2011年6月8日 星期三

WCF Data Service 在 PUT 時發生 405 Method Not Allowed

原因

最近在使用 WCF Data Services 時,WCF Data Services Client library 使用 DELETE HttpMethod 時,發生了 HTTP Error 405.0 - Method Not Allowed 的錯誤。

SNAGHTML1d31d0e

HTTP Error 405.0 - Method Not Allowed

The page you are looking for cannot be displayed because an invalid method (HTTP verb) is being used.

解決

經過不少的測試,也試過移除IIS 7 的 WebDAV module,都不成功。最簡單的方法,是在 Web.Config 中增加下面的設定。感謝 IIS 7。

<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules>
  <remove name="WebDAVModule" />
</modules>
<handlers>
  <remove name="WebDAV" />
</handlers>
</system.webServer>

 

參考

Share with Facebook