如何透過WCF Data Services呼叫Store Procedure

我想許多人都知道.NET從3.5開始支援REST服務,且REST服務幾乎快紅遍半邊天了,當中WCF Data Services則是其中一種應用,WCF Data Services後端的實際存取資料庫的核心為Entity Framework,相信許多人都比我還熟Entity Framework,所以筆者就不多說了。筆者今天必須透過WCF Data Services來存取SQL Server 2008的Store Procedure,這個Store Procedure其實是個.NET Assembly,因此順道將處理的過程寫一個Sample檔並改以Northwind資料實做一遍記錄下來(已經熟悉的朋友就跳著讀吧^^)。

首先筆者以VS 2010先建立一個空網站:


並加入一個ADO.NET 實體資料模型,並加入「HelloWorld」的預存程序,然後將命名空間設定為「NorthwindModel」:


此預存程序為一個.NET Assembly的應用程式,他會傳回一個字串型態的物件,不過這邊在使用Entity Framework呼叫Store Procedure時還須做一些處理,因為Entity Framework在更新資料庫模型時項目如果是Store Procedure或function時並不會自動產生程式碼,若開啟NorthwindModel.Designer.cs起來看,會發現只有「建構函式」與「部分方法」這兩個原先既有的區塊,如下:



這個時候需要到模型瀏覽器NorthwindModelEntityContainer. NorthwindEntities函式匯入 項目上面點選滑鼠右鍵,並選擇「加入函式匯入」,如下圖:


這時會出現「加入函式匯入」對話框,首先選擇預存程序名稱,並將函式名稱設為SP_HelloWorld,然後設定傳回值為純量的String型態,如下設定畫面:


完成後模型瀏覽器馬上會出現SP_HelloWorld這個函式的對應


並且會對 NorthwindModel.Designer.cs產生一段Function Import的程式碼,程式碼中看見我們剛剛設定的SP_HelloWorld方法,如下:
///
///沒有可用的中繼資料文件。
///

/// 沒有可用的中繼資料文件。
public ObjectResult SP_HelloWorld(ObjectParameter greeting)
{
return base.ExecuteFunction("SP_HelloWorld", greeting);
}

接著對專案加入一個WCF資料服務,引用NorthwindModel與System.Data.Objects,並指定這個資料服務的泛型常式為NorthwindEntities,並將初始化方法InitializeService中的config.SetServiceOperationAccessRule方法的服務使用權限設為”*”,接著就是撰寫程式碼了。筆者撰寫了一個GetHelloWorld()方法並貼上[WebGet()]屬性標籤,程式碼非常的簡單,如下:
using System;
using System.Data.Services;
using System.Data.Services.Common;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Web;
using System.Data.Objects;
using NorthwindModel;
using System.ServiceModel;

public class WcfSPDataService : DataService
{
// 只呼叫一次方法初始化全服務原則。
public static void InitializeService(DataServiceConfiguration config)
{
// TODO: 設定規則,指出哪些實體集及服務作業可見、可更新等等。
// 範例:
// config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}

[WebGet()]
public string GetHelloWorld()
{
NorthwindEntities entity = new NorthwindEntities();
ObjectResult result = entity.SP_HelloWorld(new ObjectParameter("Greeting", "Gelis"));
return result.First();
}
}
程式寫完了,先來測試一下吧!如下圖,WcfSPDataService.svc的執行結果:


接著將URL修改一下,加上GetHelloWorld,也就是以REST方式呼叫
http://localhost:1092/WebNorthwindDataServices/WcfSPDataService.svc/GetHelloWorld

如下的執行結果:

留言

這個網誌中的熱門文章

什麼是 gRPC ?

什麼是 gRPC(二)- 來撰寫第一個 Hello World 吧!

常見的程式碼壞味道(Code Smell or Bad Smell)