WCF學習之旅目錄
三、創建客戶端應用程序
若要創建客戶端應用程序,你將另外添加一個項目,添加對該項目的服務引用,配置數據源,並創建一個用戶界面以顯示服務中的數據。
在第一個步驟中,你將 Windows 窗體項目添加到解決方案中,並將其設置為啟動項目。
第一步,創建客戶端應用程序
- 在菜單欄上,依次選擇“文件”、“添加”、“新建項目”。
- 在“添加新項目”對話框中,展開 “Visual C#”節點,選擇“Windows”節點,然后選擇“Windows 窗體應用程序”。
- 在“名稱”文本框中,輸入 WinClient,然后選擇“確定”按鈕。 如下圖。
4. 在解決方案資源管理器中,選擇 WinClient項目節點。
5.在菜單欄上,選擇“項目”、“設為啟動項目”。
第二步,添加服務引用
- 在菜單欄上,依次選擇“項目”、“添加服務引用”。
- 在“添加服務引用”對話框中,將WCF服務的 URL(http://127.0.0.1:8888/BookService/metadata) 將粘貼在“地址”字段中。
或者點擊“發現”按鈕,出現的WCF服務地址中選擇需要的URL。如下圖。
3. 選擇“確定”按鈕以添加服務引用。
第三步,創建用戶界面
1.在“解決方案資源管理器”窗口中,選中“WinClient”項目,彈出右鍵菜單,選擇“添加—》新建項”。如下圖。
2. 在“Windows Forms”節點下,選擇“Windows窗體”,新建一個FrmBook.cs文件。如下圖。
3. 在FrmBook窗體界面中按下圖,進行拖放窗體控件。如下圖。
4. 在解決方案資源管理器中,選中 FrmBook.cs文件,在彈出菜單中,選擇“查看代碼”以打開代碼編輯器,將以下代碼添加到 btnSearch_Click 事件處理程序中:
private void btnSearch_Click(object sender, EventArgs e) { BookServiceRef.BookServiceClient bookSvrClient = new BookServiceRef.BookServiceClient(); textBoxMsg.Text = bookSvrClient.Search(string.Empty, string.Empty); List < Books > books= XMLHelper.DeSerializer<List<Books>>(textBoxMsg.Text); gridBooks.DataSource = books; }
5. 在菜單欄上,依次選擇“調試”和“啟動調試”以運行應用程序。在應用程序啟動之后,使用鼠標點擊“查詢書籍”按鈕, 此時將顯示書籍信息。 如下圖。
現在,你有了一個可以使用的應用程序,該應用程序將顯示 BookService服務中的書籍列表。 如果希望通過該服務公開其他數據,則可以修改實體數據模型以包括數據庫中的其他表。
在下一個可選步驟中,將學習如何篩選服務返回的數據。
四、添加篩選功能
在此步驟中,將在應用程序中添加根據書籍的類型篩選書籍數據的功能。
- 在解決方案資源管理器中,選中“FrmBook.cs”文件,在彈出的右鍵菜單中選擇“打開”,或者使用鼠標左鍵雙擊。
- 將工具箱中的 Lable 控件、TextBox控件和 Button 控件添加到窗體。 其中在Label中填上“類型”,Button的中填上“查詢”。
- 打開 Button 控件的快捷菜單,選擇“查看代碼”,然后在 btnSearchCategory_Click事件處理程序中添加以下代碼:
private void btnSearchCategory_Click(object sender, EventArgs e) { BookServiceRef.BookServiceClient bookSvrClient = new BookServiceRef.BookServiceClient(); textBoxMsg.Text = bookSvrClient.Search(txtCategory.Text, string.Empty); List<Books> books = XMLHelper.DeSerializer<List<Books>>(textBoxMsg.Text); gridBooks.DataSource = books; }
3. 在菜單欄上,依次選擇“調試”和“啟動調試”以運行應用程序。
4. 在紅框中的文本框中,輸入 IBM,然后使用鼠標點擊“查詢”按鈕。 將僅顯示來自 類型為IBM 的書籍。如下圖。
5. FrmBook.cs的全部代碼見下面。
using SCF.Contracts; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.ServiceModel; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using SCF.Model; using SCF.Common; namespace WinClient { public partial class FrmBook : Form { public FrmBook() { InitializeComponent(); } private void btnGetBook_Click(object sender, EventArgs e) { Books book = new Books(); BookServiceRef.BookServiceClient bookSvrClient = new BookServiceRef.BookServiceClient(); if (gridBooks.SelectedRows.Count > 0) { book = gridBooks.SelectedRows[0].DataBoundItem as Books; textBoxMsg.Text = bookSvrClient.GetBook(book.BookID.ToString()); book = XMLHelper.DeSerializer<Books>(textBoxMsg.Text); txtBookId.Text = book.BookID.ToString(); txtAuthorID.Text = book.AuthorID.ToString(); textBoxName.Text = book.Name; textBoxCategory.Text = book.Category.ToString(); textBoxPrice.Text = book.Price.ToString(); } else { textBoxMsg.Text = "沒有選中相應的記錄!"; } } /// <summary> /// ChannelFactory方式,直接在代碼中寫配置信息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonChannelFactory_Click(object sender, EventArgs e) { using (ChannelFactory<IBookService> channelFactory = new ChannelFactory<IBookService> (new WSHttpBinding(), "http://127.0.0.1:8888/BookService")) { IBookService proxy = channelFactory.CreateChannel(); using (proxy as IDisposable) { textBoxMsg.Text = proxy.GetBook("4"); Books book = XMLHelper.DeSerializer<Books>(textBoxMsg.Text); txtBookId.Text = book.BookID.ToString(); txtAuthorID.Text = book.AuthorID.ToString(); textBoxName.Text = book.Name; textBoxCategory.Text = book.Category.ToString(); textBoxPrice.Text = book.Price.ToString(); } } } /// <summary> /// ChannelFactory配置方式,在配置文件中寫配置信息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonChannelConfig_Click(object sender, EventArgs e) { using (ChannelFactory<IBookService> channelFactory = new ChannelFactory<IBookService>("WSHttpBinding_IBookService")) { IBookService proxy = channelFactory.CreateChannel(); using (proxy as IDisposable) { textBoxMsg.Text = proxy.GetBook("5"); Books book = XMLHelper.DeSerializer<Books>(textBoxMsg.Text); txtBookId.Text = book.BookID.ToString(); txtAuthorID.Text = book.AuthorID.ToString(); textBoxName.Text = book.Name; textBoxCategory.Text = book.Category.ToString(); textBoxPrice.Text = book.Price.ToString(); } } } private void btnSearch_Click(object sender, EventArgs e) { BookServiceRef.BookServiceClient bookSvrClient = new BookServiceRef.BookServiceClient(); textBoxMsg.Text = bookSvrClient.Search(string.Empty, string.Empty); List < Books > books= XMLHelper.DeSerializer<List<Books>>(textBoxMsg.Text); gridBooks.DataSource = books; } private void btnSearchCategory_Click(object sender, EventArgs e) { BookServiceRef.BookServiceClient bookSvrClient = new BookServiceRef.BookServiceClient(); textBoxMsg.Text = bookSvrClient.Search(txtCategory.Text, string.Empty); List<Books> books = XMLHelper.DeSerializer<List<Books>>(textBoxMsg.Text); gridBooks.DataSource = books; } } }