在上一篇文章中我們創建了實體對象與介面協定,在這一篇文章中我們來學習如何創建WCF的服務端代碼。創建項目BookMgr.Service的WCF服務代碼。 ...
上接WCF學習之旅—第三個示例之一(二十七)
WCF學習之旅—第三個示例之二(二十八)
在上一篇文章中我們創建了實體對象與介面協定,在這一篇文章中我們來學習如何創建WCF的服務端代碼。具體步驟見下麵。
六、創建項目BookMgr.Service的WCF服務代碼
第一步、安裝Entity Framework 6.1.3
1) 安裝過程同上一篇文章中類似。使用NuGet下載最新版的Entity Framework 6.1.3。在解決方案資源管理器中——>在項目BookMgr.Service上滑鼠右鍵單擊——>彈出一個菜單,選中“管理解決方案的NuGet程式包”,打開NuGet程式包管理界面。如下圖。
2) 在NuGet程式包管理界面中搜索 Entity,找到最新版本Entity Framework,點擊安裝。如下圖。
第二步、創建WCF服務代碼
1) 在“解決方案資源管理器”中使用滑鼠右鍵,點擊“BookMgr.Service”項目,在彈出菜單上,依次選擇“添加—》WCF服務”
2) 在“項名稱”文本框中,輸入 BookService,然後選擇“確定”按鈕。
3) 刪除同步生成的IBookService介面文件。
4) 在“解決方案資源管理器中”中,定位BookService.svc.cs文件,雙擊在“代碼編輯器”中打開,並編寫如下代碼。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using BookMgr.Contracts;
using BookMgr.Model;
using BookMgr.Common;
using System.Data.Entity;
namespace BookMgr.Service
{
// 註意: 使用“重構”菜單上的“重命名”命令,可以同時更改代碼、svc 和配置文件中的類名“BookService”。
// 註意: 為了啟動 WCF 測試客戶端以測試此服務,請在解決方案資源管理器中選擇 BookService.svc
// 或 BookService.svc.cs,然後開始調試。
public class BookService :IBookService
{
BookEntities db = new BookEntities();
public string Add(string mbook)
{
try
{
Books book = XMLHelper.DeSerializer<Books>(mbook);
db.Books.Add(book);
db.SaveChanges();
}
catch (Exception ex)
{
return ex.Message;
}
return "true";
}
public string Delete(string bookInfo)
{
try
{
Books book = XMLHelper.DeSerializer<Books>(bookInfo);
db.Entry(book).State = EntityState.Deleted;
db.SaveChanges();
}
catch (Exception ex)
{
return ex.Message;
}
return "true";
}
public void DoWork()
{
}
public string Edit(string mbook)
{
try
{
Books book = XMLHelper.DeSerializer<Books>(mbook);
db.Entry(book).State = EntityState.Modified;
db.SaveChanges();
}
catch (Exception ex)
{
//這裡如果出現異常,則返回一個自定義的錯誤信息,用於進行調試,可以看到更詳細的異常信息,方便定位問題。
string reason = GetErrorMessage(ex);
SQLError error = new SQLError("更新資料庫操作", reason);
throw new FaultException<SQLError>(error, new FaultReason(reason), new FaultCode("Edit"));
}
return "true";
}
public string Get(string Id)
{
int bookId = Convert.ToInt32(Id);
Books book = db.Books.Find(bookId);
string xml = XMLHelper.ToXML<Books>(book);
return xml;
//throw new NotImplementedException();
}
public string Search(string Category, string searchString)
{
var cateLst = new List<string>();
var cateQry = from d in db.Books
orderby d.Category
select d.Category;
cateLst.AddRange(cateQry.Distinct());
var books = from m in db.Books
select m;
if (!String.IsNullOrEmpty(searchString))
{
books = books.Where(s => s.Name.Contains(searchString));
}
List<Books> list = null;
if (string.IsNullOrEmpty(Category))
{
list = books.ToList<Books>();
//return XMLHelper.ToXML<List<Books>>(list);
}
else
{
list = books.Where(x => x.Category == Category).ToList<Books>();
// return XMLHelper.ToXML<IQueryable<Books>>(books.Where(x => x.Category == Category));
}
return XMLHelper.ToXML<List<Books>>(list);
}
StringBuilder sb = new StringBuilder();
/// <summary>
/// 遞歸獲取錯誤信息的內部錯誤信息,直到InnerException為null
/// </summary>
/// <param name="ex"></param>
private string GetErrorMessage(Exception ex)
{
if (ex.InnerException != null)
{
sb.Append("InnerException:"+ex.Message + ",");
GetErrorMessage(ex.InnerException);
}
else
{
sb.Append(ex.Message + ",");
}
return sb.ToString();
}
}
}
5) 在“解決方案資源管理器”中從“BookMgr.Model”項目中的“App.Config”文件複製到“BookMgr.Service”項目中。如下圖。
6) 在菜單欄上,依次選擇“調試”、“開始執行(不調試)”以運行服務。 此時將打開一個瀏覽視窗,並顯示該服務的 XML 架構。如下圖。
7) 關閉瀏覽器視窗。