建立分散式應用程式

2009年3月22日星期日

建立分散式應用程式

前言


在PC時代來臨以前,電腦的世界屬於大型主機的天下,而電腦的使用者也只是少數IT部門的人員。但是PC、圖型化介面以及1995年Internet的到來,推翻了原有的架構。

然而到了2000年,全球將近有三十億的人口使用Web,企業與企業間的互動日趨頻繁,使用者對網站的要求不單單只有瀏覽資訊而已,還希望能夠編輯、分析資料、交換資料等,企業開始期待一個嶄新的程式架構,希望能夠讓應用程式、裝置、與企業流程能夠充份的協同合作。 Microsoft 為了解決以上的問題,便提出的一套以Web Service 為核心的解決方案Microsoft.NET。


Microsoft .NET延伸了來自Internet及作業系統的概念,讓Internet本身成為新作業系統的基礎,也就是說,在.NET的時代,程式開發者的作業系統是架構在整個Internet之上,如此將使開發人員可以輕易的建構出程式,而不再受周邊裝置的侷限,並可透過應用程式充分與網際網路連結。


過去,開發人員總要藉助整合本機系統服務來建構應用程式。這種模式使得開發人員需要使用大量的程式設計資源,並要精準的控制這些應用程式的動作。現在,開發人員正在架構一種複合性的多層式架構系統,其將在網路上整合所有應用程式,然後創造獨到的價值。這使得開發人員需要關注所要提供的特殊服務而非整個系統的重新建構。為達到軟體網路化的目標,我們利用兩項特質,一項為更具彈性的多層次(n-tier)的運算方式,另一項則是網頁上的訊息導向概念,我們稱這樣的運算方式為「網頁服務(Web Services)」,其象徵了應用程式發展的下一階段目標。所謂網頁服務(Web Services)簡單地說,就是一種利用網際網路的標準協定,例如:HTTP、XML,將軟體的功能完全地展現在網際網路或是企業內部網路上運用的軟體服務,你也可以想像它是一種在網頁上的元件編製程序。就概念上而言,程式開發者藉由呼叫網頁服務(Web Service)介面(APIs)將網頁服務(Web Service)整合於應用程式中,就像呼叫本機服務的意思一樣。這之間的差別在於網頁服務呼叫可以透過網路來服務位於遠端的系統。


本次的課程將利用 Web Service所提供的相關技術,以Step-by-Step 的方式,建立一個多層分散式應用程式。應用程式包含三個邏輯層:資料、商務物件 (Business Object) 和使用者介面。資料層是 SQL Server 中的一個資料庫。商務物件層處理資料存取,並將其散發至用戶端。使用者介面層會同時包含 Web 架構應用程式和傳統 Windows 應用程式。下圖說明的是應用程式的架構。








0 && image.height>0){if(image.width>=700){this.width=700;this.height=image.height*700/image.width;}}">


1 分散式應用程式架構圖


建立分散式應用程式的程序


在開發分散式應用程式的過程中,通常先從資料層開始,然後移至中介層 (Middle Tier) 商務元件 (Business Rule) 物件,最後再建立使用者介面。因此,本課程首先將在 SQL Server 中建立資料庫,接著建立兩個商務物件 (Business Object) — XML Web 服務 — 然後再建置三個使用者介面 (兩個 Web Form 網頁和一個 Windows Form)。


課程大綱如下:


1. 建立Stocks資料庫


2. 建立中介層商務物件


a. 客戶資料Web服務


u 建立 ASP.NET Web 服務專案


u 建立及設定資料庫連接和資料集結構描述


u 顯露商務物件中的資料集


u Web 服務測試


b. 股票資訊Web服務


u 建立 ASP.NET Web 服務專案


u 建立及設定資料庫連接和資料集結構描述


u 顯露商務物件中的資料集


u Web 服務測試


3. 建立使用者介面


a. 客戶資料維護使用者介面


u 建立 Windows 使用者介面


u 建立 Web 使用者介面


b. 股票資訊使用者介面


u 建立 Web 使用者介面


建立Stocks資料庫


在這次的課程中我們將使用Stocks資料庫作為範例,請直接將Stocks.mdb附加至SQL Server。並請將 SQL Server的驗證模式設為Mixed模式,同時將sa帳戶的密碼設為空白以利程式之進行。


建立中介層商務物件


在這次的實作課程中,我們將商務物件放在 Web 伺服器上執行,提供分散式應用程式必要的效能和延展性 (Scalability)。我們將商務物件實作為 XML Web 服務,讓用戶端能夠使用標準的 Internet 通訊協定,從任何平台與您的商務物件通訊。


在本課程中,利用XML Web 服務建立兩個中介層 (Middle Tier) 商務元件 (Business Rule) 物件,其中一個將提供當日的股票行情資料給客戶,客戶取的這些資料後,即可依自己需要,建置新的應用程式,代表的是另一類的軟體租用觀念,而另一個則提供客戶資料維護所需之服務,整合Windows Based 與Web Based之應用程式架構。XML Web 服務元件會保留資料連接和資料集定義。然後再加入 XML Web 服務方法以顯露資料集,讓其他應用程式得以檢視和修改資料集。


客戶資料Web服務


ASP.NET Web 服務專案範本是一個 Web 架構專案,設計用來建立將介面顯露為 XML Web 服務的中介層元件。


第一個XML Web 服務會顯露兩種方法。第一種是 GetCustomers,從資料庫傳回資料集。第二種是 UpdateCustomers,以使用者的變更更新資料庫。XML Web 服務程式中必須建立許多 Private 成員以實作這兩種方法。包括資料集定義、資料配接器、資料連接,以及從資料庫擷取資料和更新資料庫的許多命令物件。下圖就是描述 XML Web 服務。







0 && image.height>0){if(image.width>=700){this.width=700;this.height=image.height*700/image.width;}}" border=0>

建立 ASP.NET Web 服務專案

1. [檔案] 功能表上,將游標指向 [新增],然後按一下 [專案] 以顯示 [新增專案] 對話方塊。

2. 根據您要使用的語言,在 [專案類型] 窗格中選取 [Visual C# 專案],然後在 [範本] 窗格中選取 [ASP.NET Web 服務]。

3. [位置] 方塊中,輸入具有專案名稱的 Web 伺服器名稱 http://ServerName/CustomersWebService,然後按一下 [確定]。

提示 如果 Web 伺服器是在您的電腦上,可以使用伺服器名稱 localhost

提示 建立 ASP.NET Web 服務專案時如果遇到問題,請參閱 Web 存取失敗對話方塊。

4. CustomersWebService 專案便會加入至方案中。Service1.asmx 的元件設計工具會在開發環境中顯示。

5. [方案總管] 中連按兩下 Service1.asmx 選取它。

6. [屬性] 視窗中,將 Service1Name 屬性設定為 CustomersService

7. [方案總管] 中,以滑鼠右鍵按一下 Service1.asmx 檔案,選取 [重新命名] 並且重新命名 CustomersService.asmx 檔案,以符合服務的名稱。

我們將在此元件中建立資料存放區的連接,並且使用資料集取得資料的執行個體。

建立及設定資料庫連接和資料集結構描述

您必須將兩個ADO.NET物件加入 XML Web 服務:一個 SqlDataAdapter 物件和一個 SqlConnection 物件。連接物件會建立至資料庫的新連接,而資料配接器則會查詢資料庫並將結果傳入 DataSet 物件。資料庫也會以使用者對資料集所做的變更更新資料庫。使用至資料庫的連接,會建立一個資料集以保存資料庫中所呈現資訊的執行個體。這個資料集稍後會在課程中被用來在 Windows Form 和 Web Form 網頁中顯示資料。

建立資料庫連線和資料配接器

1. 按一下 [伺服器總管]。

注意 依照預設,伺服器總管會在開發環境的左邊顯示為垂直索引標籤。如果未顯示索引標籤,請按一下 [檢視] 功能表,再選擇 [伺服器總管]。

2. 在伺服器總管中,用滑鼠右鍵按一下 [資料連接] 節點,然後從快速鍵功能表中選擇 [加入連接]。

3. [資料連結內容] 對話方塊的 [連線] 索引標籤中,輸入安裝 Stocks 資料庫之 SQL Server 的名稱。如果 SQL Server 是在本機電腦上,請輸入 localhost

4. 對登入資訊選取 [使用 Windows NT 整合安全性]。

注意 如果您的系統上沒有設定整合安全性,請洽詢網路管理員。

5. 從清單中選取 Stocks 資料庫。

6. 按一下 [測試連接] 以驗證您提供的資訊,然後按 [確定] 建立連接。

[伺服器總管] 的 [資料連接] 節點中就會出現一個新節點。

注意 如果資料庫連接失敗,請與資料庫管理員連繫。

7. [伺服器總管] 中,展開新連接節點的節點,然後展開 [資料表] 節點。

8. 找出 [訂閱客戶] 節點並且展開它,以顯示 [訂閱客戶] 資料表中的欄位。

9. 將這些[訂閱客戶] 資料表從伺服器總管拖曳至設計介面上。設計工具中便會顯示配對的 SqlConnection 物件和 SqlDataAdapter 物件。現在已經建立好至資料庫的連接,而且資訊的傳輸將由 SqlDataAdapter 物件處理。這些元件的設定,會將具有 [訂閱客戶] 資料表的資料集移入和移出資料庫。

注意 本課程使用已針對 SQL Server 7.0 以上版本最佳化的 SqlDataAdapter 物件。您可以使用 OleDbDataAdapter 物件,因為它更具一般性,並可對任何 OLE DB 相容的資料來源提供 ADO.NET 存取。如果您要連接的資料庫不是 SQL Server 資料庫,專案系統就會建立一個 OleDbDataAdapter 物件和一個 OleDbConnection 物件。

注意 在本課程中,您必須使用 [訂閱客戶] 資料表的某些資料行和所有資料列來填入資料集。在實際執行的應用程式中,通常是藉由建立只傳回所需資料行和資料列的查詢,來最佳化資料存取。

建立資料集類別定義

1. 在方案總管中連按兩下 CustomersService 檔案,以便在設計工具中開啟它。

2. [資料] 功能表選擇 [產生資料集]。在 [產生資料集] 對話方塊中選取 [新增],並將資料集命名為「dsCustomers」。不要選取標示為「將此資料集加入設計工具中」的核取方塊。

注意 專案中將加入一個結構描述檔 dsCustomers.xsd。此結構描述檔包含 dsCustomers 的類別定義。這個類別是繼承自 DataSet 類別,含有 [訂閱客戶] 資料表的具型別資料集定義。

3. [檔案] 功能表中選擇 [全部儲存]。

顯露商務物件中的 dsCustomers 資料集

課程中的下一步驟,是顯露您剛才從商務物件建立的資料集物件。這個動作可以讓 Windows 或 Web 應用程式使用這個資料集。

將方法加入至 XML Web 服務

1. 在方案總管中,連按兩下 CustomersService (如果尚未在設計工具中開啟它)。

2. [檢視] 功能表上,按一下 [程式碼]。

3. 加入名為 GetCustomers 的方法,將資料集提供給用戶端。

這個方法 (如下所示) 會建立新的 dsCustomers 資料集,並且使用 SqlDataAdapter 物件由[訂閱客戶] 資料表來填入資料集。接著方法會傳回資料集。

// C#

[WebMethod]

public dsCustomers GetCustomers()

{

dsCustomers ds = new dsCustomers ();

sqlDataAdapter1.Fill(ds);

return ds;

}

4. 加入名為 UpdateCustomers 的方法,將用戶端的變更傳播回資料庫。

這個方法 (如下所示) 有一個 dsCustomers 資料集參數(CustomerChanges),這個參數含有變更的資料,並且會透過 SqlDataAdapter.Update 方法更新資料庫。Update 方法會接受資料集中的變更。資料集會傳回用戶端。用戶端再使用此傳回的資料集更新自己的 dsCustomers 資料集執行個體。如需 Update 方法和接受資料集中變更的詳細資訊,請參閱資料配接器簡介。

// C#

[WebMethod]

public dsCustomers UpdateCustomers(dsCustomers CustomerChanges)

{

if (CustomerChanges != null)

{

sqlDataAdapter1.Update(CustomerChanges);

return CustomerChanges;

}

else

{

return null;

}

}

注意 在實際使用的應用程式中,您應該在這些方法中加入錯誤檢查和例外處理 (Exception Handling)。

5. [檔案] 功能表中選擇 [全部儲存]。

6. [建置] 功能表上,選擇 [建置方案]。

您必須設定專案的安全性設定來配合整合式安全性。方法是關閉匿名存取並且開啟模擬功能。

設定整合式 Windows 驗證

若要為專案設定整合式 Windows 驗證,您必須變更專案檔案並且使用 Internet Information Services 工具設定專案。

1. 啟動 Internet Information Services 工具。它可以從 [控制台] 的 [系統管理工具] 執行 (如需啟動這個工具的詳細資訊,請參閱 Windows 說明文件)。

2. 展開您伺服器的節點。

3. 展開 [預設的 Web 網站] 節點。

4. 以滑鼠右鍵按一下 [CustomersWebService] 節點,然後從快速鍵功能表中選擇 [內容]。

5. 按一下 [目錄安全設定] 索引標籤。

6. [匿名存取及驗證控制] 區段中按一下 [編輯] 按鈕。

7. 清除 [匿名存取] 核取方塊。

8. 選取 [整合的 Windows 驗證] 核取方塊。您現在已經設定好您的 XML Web 服務目錄了。

9. 請返回 Visual Studio 中的專案,在 [方案總管] 中連按兩下 Web.config 檔案。

10. 將下列標記加入到 <system.web> 標記之後的行,為您的 XML Web 服務設定整合式安全性。

<identity impersonate="true"/>

您已經在前面幾節建立了包含繫結至 SQL Server 資料庫之資料集的中介層商務物件。您已將程式碼加入至中介層 CustomersWebService XML Web 服務,從資料來源取得資料,並使用變更更新資料來源。用戶端會透過 GetCustomers UpdateCustomers XML Web 服務方法存取這些功能。

XML Web 服務偵錯

Visual Studio 提供一些從 IDE 內建置和執行 XML Web 服務的方法,例如:

· 啟動 (並偵錯)

· 啟動但不偵錯

· 建置並預覽

如同 Visual Studio 專案,這個 XML Web 服務針對發行和偵錯版本會有不同的組態。因為您是以 ASP.NET Web 服務專案範本來建立這個專案,所以 Visual Studio 會自動建立這些組態,並設定適當的預設選項和其他設定。如需詳細資訊,請參閱偵錯和版本組態。

在這個課程中,您將在 XML Web 服務放置中斷點,並使用 Start (配合偵錯) 方法。如需詳細資訊,請參閱在 Managed 程式碼偵錯 XML Web 服務。

進行偵錯前,請先驗證您的偵錯設定。 如需詳細資訊,請參閱偵錯準備:ASP.NET Web 服務專案。

若要使用中斷點並在偵錯方式下啟動 XML Web 服務

1. 直接在程式碼編輯視窗 GetCustomers Function的左邊界按滑鼠左鍵或是按一下 [偵錯] 功能表中的 [新增中斷點]。在 [函式] 索引標籤上的 [函式] 方塊中輸入 GetCustomers,並按一下 [確定] 以在 GetCustomers 方法宣告上加入中斷點。

2. [偵錯] 功能表上,按一下 [啟動]。

這個命令指示 Visual Studio 在偵錯工具中執行 XML Web 服務。Visual Studio 會建置專案,並將其部署至指定的開發伺服器。完成時,預設瀏覽器會顯示來自部署伺服器的 .asmx 檔案。

3. 若要停止執行 XML Web 服務並回到程式碼編輯器,請關閉瀏覽器。

— 或 —

[偵錯] 功能表上,按一下 [停止偵錯]。

秘訣 F5 是 [啟動] 的預設鍵盤快速鍵,而 SHIFT+F5 是 [停止偵錯] 的預設鍵盤快速鍵。

在瀏覽器中開啟 .asmx 檔案時,XML Web 服務會傳回提供 XML Web 服務相關資訊的服務說明網頁。[服務合約] 連結會將您連至含有 XML Web 服務的正式服務描述的 XML 文件。如需詳細資訊,請參閱 XML Web 服務描述。

4. 在服務說明網頁上,按一下 GetCustomers 連結。

5. 然後按一下 [叫用] 按鈕。

程式到達GetCustomers 函式時會停止。Visual Studio 偵錯工具會將含有中斷點的行反白,您可以在中止期間執行各種工作。如需詳細資訊,請參閱使用偵錯工具和檢查您的程式的偵錯工具。

6. [偵錯] 功能表上,按一下 [繼續] 來繼續進行處理。

秘訣 F5 是 [繼續] 的預設鍵盤快速鍵。

7. XML Web 服務將 XML 文件中的已轉換值傳回以做出回應。

若要停止執行 XML Web 服務並回到程式碼編輯器,請在 [偵錯] 功能表按一下 [停止偵錯]。
股票行情Web服務

第二個XML Web 服務只顯露一方法GetData,讓合法訂閱者可以取得股市資訊, XML Web 服務程式中必須建立許多 Private 成員以實作這方法。包括資料集定義、資料配接器、資料連接,以及從資料庫讀取或擷取資料的許多命令物件。另外,因為使用者來自公司外部,因此採取程式驗證。下圖就是描述 XML Web 服務。

0 && image.height>0){if(image.width>=700){this.width=700;this.height=image.height*700/image.width;}}" border=0>

建立 ASP.NET Web 服務專案

1. [檔案] 功能表上,將游標指向 [加入專案],然後按一下 [新增專案] 以顯示 [新增專案] 對話方塊。

2. 根據您要使用的語言,在 [專案類型] 窗格中選取 [Visual C# 專案],然後在 [範本] 窗格中選取 [ASP.NET Web 服務]。

3. [位置] 方塊中,輸入具有專案名稱的 Web 伺服器名稱 http://ServerName/StocksWebService,然後按一下 [確定]。

提示 如果 Web 伺服器是在您的電腦上,可以使用伺服器名稱 localhost

提示 建立 ASP.NET Web 服務專案時如果遇到問題,請參閱 Web 存取失敗對話方塊。

4. StocksWebService 專案便會加入至方案中。Service1.asmx 的元件設計工具會在開發環境中顯示。

5. [方案總管] 中連按兩下 Service1.asmx 選取它。

6. [屬性] 視窗中,將 Service1Name 屬性設定為 StocksService

7. [方案總管] 中,以滑鼠右鍵按一下 Service1.asmx 檔案,選取 [重新命名] 並且重新命名 StocksService.asmx 檔案,以符合服務的名稱。

我們將在此元件中建立資料存放區的連接,並且使用資料集取得資料的執行個體。

建立及設定資料庫連接和資料集結構描述

在這一階段,我們仍使用前一階段的兩個ADO.NET物件加入 XML Web 服務:一個 SqlDataAdapter 物件和一個 SqlConnection 物件。連接物件會建立至資料庫的新連接,而資料配接器則會查詢資料庫並將結果傳入 DataSet 物件。這個資料集稍後會在課程中訂閱客戶的 Web Form 網頁中顯示資料。

另一方面,因使用者不屬於公司內部,因此我們採用程式驗證的方式。利用DataReader物件讀取客戶資料並加以驗證。

課程中的下一步驟,是顯露您剛才從商務物件建立的資料集物件。這個動作可以讓 Windows 或 Web 應用程式使用這個資料集。

將方法加入至 XML Web 服務、顯露商務物件中資料集

1. 在方案總管中,連按兩下 StocksService (如果尚未在設計工具中開啟它)。

2. [檢視] 功能表上,按一下 [程式碼]。

3. 加入名為 GetData 的方法,將資料集提供給用戶端。這個方法 (如下所示)利用DataReader讀取客戶資料進行驗證,根據驗證結果分別讀取股票行情表或說明,建立新的資料集,並且使用 SqlDataAdapter 物件填入資料集。接著方法會傳回資料集。 另外為了能方便使用,ADO.NET的物件,請在程式碼的開始處加入以下程式碼:

using System.Data.SqlClient

//C#

[WebMethod()] public DataSet GetData(string strUserID,string strPWD)

{

string strValidate;

string strCmd;

string strCnn;

DataSet oDS;

oDS=new DataSet();

strValidate = "Select * from 訂閱客戶 where ID='" + strUserID +"' and [Password]='" + strPWD + "'";

strCnn = "User ID=sa; Password=; Initial Catalog=Stocks;

Data Source=localhost";

SqlConnection MyCnn=new SqlConnection(strCnn);

SqlCommand MyCmd=new SqlCommand(strValidate,MyCnn);

SqlDataReader oDr;

MyCnn.Open();

oDr=MyCmd.ExecuteReader();

if (oDr.Read())

strCmd = "Select 股票代號,股票名稱,收盤價,漲跌,最高價,最低價,成交量 from 股票行情表";

else

strCmd = "Select * from 說明";

oDr.Close();

SqlDataAdapter oCMD=new SqlDataAdapter(strCmd,MyCnn);

oCMD.Fill (oDS,"Stocks");

return oDS;}

注意 在實際使用的應用程式中,您應該在這些方法中加入錯誤檢查和例外處理 (Exception Handling)。

4. [檔案] 功能表中選擇 [全部儲存]。

5. [建置] 功能表上,選擇 [建置方案]。

XML Web 服務測試

在瀏覽器中開啟 .asmx 檔案時,XML Web 服務會傳回提供 XML Web 服務相關資訊的服務說明網頁。[服務合約] 連結會將您連至含有 XML Web 服務的正式服務描述的 XML 文件。如需詳細資訊,請參閱 XML Web 服務描述。

8. 在服務說明網頁上,按一下 GetData 連結。

9. strUserID輸入:CPLi;在strPWD輸入:password

10. 然後按一下 [叫用] 按鈕。

11. 嘗試輸入其他錯誤資訊,然後按一下 [叫用] 按鈕。比較輸出結果。

建立使用者介面

建立了資料存取的中介層商務物件,並且將其顯露為 XML Web 服務後,下一步就是建立用戶端介面。本課程所使用的使用者介面包括傳統 Windows Form 和 Web Form 網頁。其中客戶資料維護使用者介面使用Windows Form 和 Web Form兩種,另外則使用Web Form展示股票行情。

Windows 介面使用用戶端電腦的功能來處理應用程式的部分處理。通常,Windows 介面會提供比 Web 架構介面更強的功能,以及更豐富的使用者體驗。由於伺服器不必執行全部的應用程式邏輯,因此伺服器上的負載低於 Web 前端 (Front End) 的負載。此外,Windows 介面可以利用能透過作業系統使用的資源,包括呼叫檔案系統和登錄。

Web 介面可讓您的應用程式供各式各樣的用戶端電腦和瀏覽器使用。所有的使用者介面處理都是在 Web 伺服器上完成,而非在用戶端上完成。

客戶資料維護使用者介面

Windows 使用者介面

Windows Form 構成的 Windows 應用程式包含對 CustomersWebService 的參考。按一下表單上的 [載入] 按鈕時,資料庫中的資料就會顯示在 DataGrid 控制項中。此載入行為是利用呼叫 XML Web 服務的 GetCustomers 方法來實作的。DataGrid 控制項允許直接編輯,且資料變更會直接傳遞至基礎資料集。表單也會有個 [儲存] 按鈕。這個按鈕的程式碼會呼叫 XML Web 服務的 UpdateCustomers 方法,將變更儲存回資料庫。

0 && image.height>0){if(image.width>=700){this.width=700;this.height=image.height*700/image.width;}}" border=0>

建立 Windows 應用程式

1. [檔案] 功能表上,將游標指向 [加入專案],然後按一下 [新增專案] 開啟 [加入新的專案] 對話方塊。

2. 根據您要使用的語言,從 [專案類型] 窗格中選取 [Visual C# 專案],然後從 [範本] 窗格中選取 [Windows 應用程式]。

3. 將專案命名為 CustomersWinClient 並且為專案選取一個位置。CustomersWinClient 專案便會加入至方案。Form1 會自動加入至專案,並且會在 Windows Form 設計工具中顯示。

4. 為您稍早建立的 ASP.NET Web 服務專案加入參考:

a. 在方案總管中,於 CustomersWinClient 專案上按一下滑鼠右鍵,然後按一下快速鍵功能表上的 [加入 Web 參考]。

b. [加入 Web 參考] 對話方塊上方的 [位址] 方塊中,輸入 XML Web 服務專案的位置(http://ServerName/CustomersWebService/CustomersService.asmx),然後按 ENTER。如果無法加入 Web 參考,請參閱加入 Web 參考對話方塊以及加入和移除 Web 參考

c. 按一下 [加入參考]。

d. 現在您可以在應用程式中建立 dsCustomers 資料集的執行個體。

將控制項加入至表單

1. [工具箱] 的 [Windows Form] 索引標籤將 DataGrid 控制項拖曳至表單。

2. [工具箱] 的 [Windows Form] 索引標籤將 Button 控制項拖曳至表單。將按鈕的 Name 屬性設定為 LoadDataText 屬性設定為 Load

3. [工具箱] 的 [Windows Form] 索引標籤將另一個 Button 控制項拖曳至表單。將按鈕的 Name 屬性設定為 SaveDataText 屬性設定為 Save

4. [工具箱] 的 [資料] 索引標籤將 DataSet 物件拖曳至表單。[加入資料集] 對話方塊隨即出現。選取 [型別資料集],並從 [名稱] 清單中選擇「CustomersWinClient.ServerName.dsCustomers」。此動作會在元件匣建立一個以 dsCustomers 資料集類別定義為基礎的 DataSet 物件。

5. 選取 DataSet 控制項,將 Name 屬性設定為 CustomersData

6. 選取 DataGrid 控制項,然後從 [DataSource] 屬性清單中選取 [CustomersData]。從 [DataMember] 屬性清單中選取 [訂閱客戶]。DataGrid 的資料行標題是設定為 [訂閱客戶] 資料表的資料行名稱。

LoadData 和 SaveData 按鈕加入程式碼

1. [檢視] 功能表上按一下 [設計工具]。在 [LoadData] 按鈕上按兩下,建立 Click 事件的空白事件處理常式。呼叫 XML Web 服務方法時,是先建立服務類別的執行個體,再呼叫服務方法。在這個案例中,呼叫的是 GetCustomers 方法。傳回的資料集會與 CustomersData 資料集合併。XML Web 服務的 Credentials 屬性是用來將您的識別 (Identity) 傳遞給 XML Web 服務,然後再依次傳遞給資料庫伺服器。將下面所示的程式碼加入至方法。

注意 如果 XML Web 服務不是在您的本機電腦上執行,必須將程式碼範例中的 localhost 取代成執行 XML Web 服務之伺服器的名稱。

// Visual C#

private void LoadData _Click(object sender, System.EventArgs e)

{

CustomersWinClient.localhost.CustomersService ws =

new CustomersWinClient.localhost.CustomersService();

ws.Credentials = System.Net.CredentialCache.DefaultCredentials;

CustomersData.Merge(ws.GetCustomers());

}

2. [檢視] 功能表上按一下 [設計工具]。在 [SaveData] 按鈕上按兩下,建立 Click 事件的空白事件處理常式。

如果資料集內有變更,會建立新的 dsCustomers 型別資料集,只保存變更的資料。此資料集會再傳遞至 XML Web 服務的 UpdateCustomers 方法。已接受變更的資料集會傳回,並且會更新 CustomersData 資料集,以反映這些新變更。如需資料集中變更的詳細資訊,請參閱資料配接器簡介。

注意 在實際使用的應用程式中,您可能會想在這個步驟中考慮資料並行的問題。如需詳細資訊,請參閱 ADO.NET 中的資料並行簡介。

將以下程式碼加入至方法中:

// Visual C#

private void SaveData _Click(object sender, System.EventArgs e)

{

if (CustomersData.HasChanges())

{

CustomersWinClient.localhost.CustomersService ws =

new CustomersWinClient.localhost.CustomersService();

ws.Credentials = System.Net.CredentialCache.DefaultCredentials;

CustomersWinClient.localhost.dsCustomers diffCustomers

= new CustomersWinClient.localhost.dsCustomers();

diffCustomers.Merge(CustomersData.GetChanges());

diffCustomers = ws.UpdateCustomers(diffCustomers);

CustomersData.Merge(diffCustomers);

}

}

執行應用程式

1. [檔案] 功能表中選擇 [全部儲存]。

2. 從方案總管中選取 CustomersWinClient,按一下滑鼠右鍵,然後選擇 [設定為啟始專案]。

3. CTRL+F5 執行應用程式。會出現一個視窗,其中包含一個空的資料表。

4. 按一下 [載入] 以填入資料表,進行一些變更,然後按一下 [儲存] 以儲存所做的變更。

Web 使用者介面

Web 介面可讓您的應用程式供各式各樣的用戶端電腦和瀏覽器使用。所有的使用者介面處理都是在 Web 伺服器上完成,而非在用戶端上完成。您將會使用 Web Form 網頁建立一個 Web 介面,存取與前一節建立之 Windows 介面所存取者相同的中介層商務物件。

0 && image.height>0){if(image.width>=700){this.width=700;this.height=image.height*700/image.width;}}" border=0>

建立 Web Form 應用程式

1. [檔案] 功能表上指向 [加入專案],再按一下 [新增專案]。

2. [加入新的專案] 對話方塊中的 [專案類型] 窗格中選取 [Visual C# 專案],然後按一下 [範本] 窗格中的 [ASP.NET Web 應用程式]。

3. [位置] 方塊中,輸入具有專案名稱的 Web 伺服器名稱 http://ServerName/CustomersWebClient,然後按一下 [確定]。新的專案會加入至方案總管中。名為 WebForm1.aspx 的 Web Form 網頁會加入至專案,並且載入設計工具中。

4. 為您稍早建立的 ASP.NET Web 服務專案加入參考:

a. 在方案總管中,以滑鼠右鍵按一下 CustomersWebClient 專案,然後按一下快速鍵功能表上的 [加入 Web 參考]。

b. [加入 Web 參考] 對話方塊上方的 [位址] 方塊中,輸入 XML Web 服務專案的位置(http://ServerName/CustomersWebService/CustomersService.asmx),然後按 ENTER。

c. 按一下 [加入參考]。

d. 現在您可以在應用程式中建立 dsCustomers 資料集的執行個體。

將控制項加入至 Web 網頁

1. [工具箱] 的 [資料] 索引標籤將 DataSet 物件拖曳至表單。[選擇資料集] 對話方塊隨即出現。選取型別資料集並從 [名稱] 清單中選擇「CustomersWebClient.ServerName.dsCustomers」。DataSet 物件便會加入至元件匣。

2. 選取 DataSet 物件,將 Name 屬性設定為 CustomersData

3. [工具箱] 的 [Web Form] 索引標籤將 DataGrid 控制項拖曳至表單。

4. DataGrid 控制項的 [屬性] 視窗中,將 DataSource 屬性設定為 CustomersDataDataMember 屬性設定為 訂閱客戶。這些設定便會出現在這些控制項的下拉式清單中。DataGrid 的資料行標題是設定為 [訂閱客戶] 資料表的資料行名稱。

5. 若要支援 DataGrid 控制項中的就地編輯,必須加入包含 [編輯] 按鈕的 [編輯、更新、取消] 資料行。使用者按一下 [編輯] 按鈕時,資料列的內容就會顯示在文字方塊中,而且 [編輯] 按鈕也會由 [更新] 和 [取消] 按鈕取代。若要加入此欄位:

a. 按一下 [屬性] 視窗下方的 [屬性產生器] 連結,然後從對話方塊中選取 [資料行] 索引標籤。

b. 展開 [可用的資料行] 窗格中的 [按鈕欄位] 項目。

c. 選擇 [編輯]、[更新]、[取消],並且按一下 [>]按鈕。

d. 按一下 [確定]。

編輯、更新和取消按鈕加入程式碼

1. 在表單上按一下滑鼠右鍵,然後選取 [檢視程式碼]。將程式碼加入至 Page_Load 事件以填入 DataGrid 控制項,如下所示。這個程式碼會建立 XML Web 服務的執行個體,填入 CustomersData 資料集,並且將這個資料集繫結至 DataGrid 控制項。每次網頁回傳給使用者時,方格中將會含有資料庫中最新的資料複本。XML Web 服務的 Credentials 屬性是用來將您的識別傳遞給 XML Web 服務,然後再依次傳遞給資料庫伺服器。

注意 在此課程中中,Web Form 網頁每次下載至用戶端瀏覽器時,就會從資料庫擷取一份全新的 [訂閱客戶] 資料表複本。這無法提供最佳的效能。如需有關效能最佳化的其他方法之討論,請參閱 Web 資料存取策略建議。

' Visual C#

private void Page_Load(object sender, System.EventArgs e)

{

CustomersWebClientcs.localhost.CustomersService ws =

new CustomersWebClientcs.localhost.CustomersService();

ws.Credentials = System.Net.CredentialCache.DefaultCredentials;

CustomersData.Merge(ws.GetCustomers());

if (! Page.IsPostBack)

{

DataGrid1.DataBind();

}

}

2. 使用者按一下 [編輯] 按鈕時,就會引發 DataGrid 控制項的 EditCommand 事件。請使用這個事件來變更 DataGrid 控制項的 EditItemIndex 屬性。EditItemIndex 屬性指定的資料列就會顯示出來,而且所有的資料都會出現在文字方塊中。

a. 建立 EditCommand 事件的事件處理常式。

Visual C# 中,按一下 DataGrid1 控制項。在 [屬性] 視窗中按一下 [事件] 按鈕,以顯示 DataGrid 事件的清單。按兩下 EditCommand 事件。

加入以下的程式碼。

' Visual C#

private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)

{

DataGrid1.EditItemIndex = e.Item.ItemIndex;

DataGrid1.DataBind();

}

3. 建立 CancelCommand 事件的事件處理常式。(請參閱加入事件處理常式的步驟 2)使用者按一下 [取消] 按鈕時,就會引發 DataGrid 控制項的 CancelCommand 事件。使用這個事件將 EditItemIndex 屬性設定為 –1,使目前資料列再次顯示為文字。加入以下的程式碼。

' Visual C#

private void DataGrid1_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)

{

DataGrid1.EditItemIndex =-1;

DataGrid1.DataBind();

}

4. 使用者按一下 [更新] 按鈕時,就會引發 DataGrid 控制項的 UpdateCommand 事件。這個方法是負責以 DataGrid 控制項的變更來更新 CustomersData 資料集,並且透過 XML Web 服務將這些變更傳播回資料庫。建立 UpdateCommand 事件的事件處理常式。加入以下的程式碼。

' Visual C#

private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)

{

for (int i=1; i<CustomersData.Tables[0].Columns.Count; i++)

{

TextBox t = (TextBox)(e.Item.Cells[i].Controls[0]);

DataRow row =CustomersData.訂閱客戶[e.Item.DataSetIndex];

row[CustomersData.Tables[0].Columns[i-1].Caption] = t.Text;

}

if (CustomersData.HasChanges())

{

CustomersWebClientcs.localhost.CustomersService ws =

new CustomersWebClientcs.localhost.CustomersService();

ws.Credentials = System.Net.CredentialCache.DefaultCredentials;

CustomersWebClientcs.localhost.dsCustomers diffCustomers =

new CustomersWebClientcs.localhost.dsCustomers();

diffCustomers.Merge(CustomersData.GetChanges());

ws.UpdateCustomers(diffCustomers);

CustomersData.Merge(diffCustomers);

}

DataGrid1.EditItemIndex = -1;

DataGrid1.DataBind();

}

設定整合式 Windows 驗證

若要對專案設定整合式 Windows 驗證,您必須變更專案檔案並且使用 Internet Information Services 工具設定專案。

1. 啟動 Internet Information Services 工具。它可以從 [控制台] 的 [系統管理工具] 執行 (如需啟動這個工具的詳細資訊,請參閱 Windows 說明文件)。展開您伺服器的節點。

2. 展開 [預設的 Web 網站] 節點。

3. 以滑鼠右鍵按一下 [CustomersWebClient] 節點,然後從快速鍵功能表中選擇 [內容]。

4. 按一下 [目錄安全設定] 索引標籤。

5. [匿名存取及驗證控制] 區段中按一下 [編輯] 按鈕。

6. 清除 [匿名存取] 核取方塊。

7. 選取 [整合的 Windows 驗證] 方塊。您現在已經設定好您的 XML Web 服務目錄了。

8. 請返回 Visual Studio 中的專案,按兩下方案總管中的 Web.config 檔案。

9. 將下列標記加入到 <system.web> 標記之後的行,為您的 XML Web 服務設定整合式安全性。<identity impersonate="true"/>

執行應用程式

1. 從方案總管中選取 CustomersWebClient,按一下滑鼠右鍵,然後選擇 [設定為啟始專案]。

2. CTRL+F5 執行應用程式。

股票行情資料使用者介面

Web 使用者介面

Web Form 構成的 Windows 應用程式包含對 StocksWebService 的參考。利用呼叫 XML Web 服務的 GetData 方法來載入資料集,並將資料展示在DataGrid上。

0 && image.height>0){if(image.width>=700){this.width=700;this.height=image.height*700/image.width;}}" border=0>

建立 Web Form 應用程式

1. [檔案] 功能表上指向 [加入專案],再按一下 [新增專案]。

2. [加入新的專案] 對話方塊中的 [專案類型] 窗格中選取 [Visual C# 專案],然後按一下 [範本] 窗格中的 [ASP.NET Web 應用程式]。

3. [位置] 方塊中,輸入具有專案名稱的 Web 伺服器名稱 http://ServerName/StocksWebClient,然後按一下 [確定]。新的專案會加入至方案總管中。名為 WebForm1.aspx 的 Web Form 網頁會加入至專案,並且載入設計工具中。

4. 為您稍早建立的 ASP.NET Web 服務專案加入參考:

a. 在方案總管中,以滑鼠右鍵按一下 StocksWebClient 專案,然後按一下快速鍵功能表上的 [加入 Web 參考]。

b. [加入 Web 參考] 對話方塊上方的 [位址] 方塊中,輸入 XML Web 服務專案的探索檔位置 (http://ServerName/StocksWebService/StocksService.asmx),然後按 ENTER。

c. 按一下 [加入參考]。

d. 現在您可以在應用程式中建立資料集的執行個體。

將控制項加入至 Web 網頁

1. [工具箱] 的 [Web Form] 索引標籤將 DataGrid 控制項拖曳至表單。

2. 在表單上按一下滑鼠右鍵,然後選取 [檢視程式碼]。將程式碼加入至 Page_Load 事件以填入 DataGrid 控制項,如下所示。這個程式碼會建立 XML Web 服務的執行個體,填入資料集,並且將這個資料集繫結至 DataGrid 控制項。每次網頁回傳給使用者時,方格中將會含有資料庫中最新的資料複本。

private void Page_Load(object sender, System.EventArgs e)

{

localhost.StocksService myObj=new localhost.StocksService();

DataGrid1.DataSource =myObj.GetData("CPLi","password");

DataGrid1.DataBind() ;

}

3. 為了畫面的美觀,可以加入格式設定。

a. 按一下 [屬性] 視窗下方的 [自動格式化] 連結,然後選擇喜好的樣式。

b. 按一下 [確定]。

c. CTRL+F5 執行應用程式。

4. 可利用上一節完成的客戶維護應用程式,修改CPLi客戶的密碼,在執行一次本程式。





0 评论:

发表评论