日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WCF学习之旅—基于Fault Contract 的异常处理(十八)

發布時間:2025/7/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WCF学习之旅—基于Fault Contract 的异常处理(十八) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????? WCF學習之旅—WCF中傳統的異常處理(十六)

????????? WCF學習之旅—基于ServiceDebug的異常處理(十七)

三、基于Fault Contract 的異常處理

?????? 第二個示例是通過定制ServiceDebug來獲取服務端的異常,但是這種方式只能用于Debug階段。在我們的WCF應用發布之后,這種獲取異常的方式無法在我們的工作環境中使用。我們必須找到一種異常處理方式可以在客戶端獲取相應的異常提示信息。那就是我們接下來要介紹的基于FaultContract的解決方案。我們知道WCF采用一種基于 Contract,Contract定義了進行交互的雙方進行消息交換所遵循的準則和規范。Service Contract定義了包含了所有Operation的Service的接口,Data Contract定義了交互的數據的結構,而FaultContract實際上定義需要再雙方之間進行交互的了異常、錯誤的表示。現在我們來學習如何使用基于FaultContract的異常處理。

?????????? 我們首先來定義一個表示Fault的類:SQLError。考慮到這個類需要在Service 和Client使用,我把它定義在SCF.Contracts中:

?

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace SCF.Contracts {[DataContract]public class SQLError{private string _operation;private string _errorMessage;public SQLError(string operation, string errorMessage){this._operation = operation;this._errorMessage = errorMessage;}[DataMember]public string Operation{get { return _operation; }set { _operation = value; }} [DataMember]public string ErrorMessage{get { return _errorMessage; }set { _errorMessage = value; }}}}

??? 如果你出現如下圖的錯誤信息,請引用一下System.Runtime.Serialization.dll。

?

????? 在SQLError中定義了兩個成員:表示出 錯操作的Operation和出錯信息的ErrorMessage。由于該類的對象需要在終結點之間傳遞,所以必須是可序列化的,在WCF中, 我們一般用兩個不同的Serializer實現Object和XML的Serialization和 Deserialization:Datacontract Serializer和XML Serializer。而對于Fault,只能使用前者。

?????? 定義了SQLError,我們需要通過特性FaultContract將其添加到EditBook方法上面,我們把IBookService接口修改成如下。

?

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text;namespace SCF.Contracts {// 注意: 使用“重構”菜單上的“重命名”命令,可以同時更改代碼和配置文件中的接口名“IBookService”。 [ServiceContract]public interface IBookService{ [OperationContract]string GetBook(string Id);[OperationContract]string AddBook(string book);[OperationContract][FaultContract(typeof(SQLError))]string EditBook(string book);[OperationContract]string Search(string Category, string searchString);} }

?

?????? 我們在EditBook上運用了 FaultContract,并指定了封裝了Fault對應的類型,那么最終這個基于SQLError類型的FaultContract會被寫入 Service Description中,客戶端通過獲取該Service Description(一般是獲取WSDL),它就被識別它,就會將從接收到的Soap中對該Fault的XML Mapping到具體的SQLError類型。

?????? 接著我們在服務端的出錯處理中拋出Exception的方式植入這個SQLError對象:

?

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using System.Data.Entity; using SCF.Contracts; using SCF.Model; using SCF.Common;namespace SCF.WcfService {// 注意: 使用“重構”菜單上的“重命名”命令,可以同時更改代碼、svc 和配置文件中的類名“BookService”。// 注意: 為了啟動 WCF 測試客戶端以測試此服務,請在解決方案資源管理器中選擇 BookService.svc 或 BookService.svc.cs,然后開始調試。public class BookService : IBookService{Entities db = new Entities();public string AddBook(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 EditBook(string mbook){try{Books book = XMLHelper.DeSerializer<Books>(mbook);db.Entry(book).State = EntityState.Added;db.SaveChanges();}catch (Exception ex){//return ex.Message; SQLError error = new SQLError("更新數據庫操作", ex.Message);string reason = string.Empty;if (ex.InnerException != null){reason = string.Format("{0}。{1}"ex.Message, ex.InnerException.Message);}else reason = ex.Message;throw new FaultException<SQLError>(error, new FaultReason(reason), new FaultCode("Edit"));}return "true";} public string GetBook(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.Booksorderby d.Categoryselect d.Category;cateLst.AddRange(cateQry.Distinct()); var books = from m in db.Booksselect 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>();}else{list = books.Where(x => x.Category == Category).ToList<Books>();}return XMLHelper.ToXML<List<Books>>(list);}}}

???? 在catch中,拋出FaultException<SQLError> Exception,并指定具體的SQLError對象,以及一個FaultCode(一般指明出錯的來源)和FaultReason(出錯的原因)。我們現在先不修改客戶端的異常處理的相關代碼,先運行Hosting,看看WSDL中什么特別之處,如下圖:


??? 通 過上圖,我們可以看到,在EditBook方法的WSDL定義了中多了一些節點。

??? 弄清楚了Fault在WSDL中表示后,我們來修改我們客戶端的代碼,來有效地進行異常處理:

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 ShowBook(){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();textBoxRating.Text = book.Rating.ToString();textBoxNumberofcopies.Text = book.Numberofcopies.ToString();dateTimePickerPublishDate.Text = book.PublishDate.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 buttonSave_Click(object sender, EventArgs e){try{using (ChannelFactory<IBookService> channelFactory = new ChannelFactory<IBookService>("WSHttpBinding_IBookService")){IBookService proxy = channelFactory.CreateChannel();using (proxy as IDisposable){if (string.IsNullOrEmpty(txtBookId.Text)){textBoxMsg.Text = proxy.AddBook(GetBookInfo());}elsetextBoxMsg.Text = proxy.EditBook(GetBookInfo());}}}catch (FaultException<SQLError> ex){SQLError error = ex.Detail;textBoxMsg.Text = string.Format("拋出一個服務端錯誤。\r\n\t錯誤代碼:{0}\n\t錯誤原因:{1}\r\n\t操作:{2}\r\n\t錯誤信息:{3}",
ex.Code, ex.Reason, error.Operation, error.ErrorMessage);}
catch (Exception ex){if (ex.InnerException != null){textBoxMsg.Text = ex.Message + ex.InnerException.Message;}elsetextBoxMsg.Text = ex.Message;}}public String GetBookInfo(){Books book = new Books();book.AuthorID = NumberHelper.ToInt(txtAuthorID.Text);book.BookID = NumberHelper.ToInt(txtBookId.Text);book.Category = textBoxCategory.Text;book.Name = textBoxName.Text;book.Numberofcopies = NumberHelper.ToInt(textBoxNumberofcopies.Text);book.Price = NumberHelper.ToDecimal(textBoxPrice.Text);book.PublishDate = dateTimePickerPublishDate.Value;book.Rating = textBoxRating.Text;textBoxMsg.Text = XMLHelper.ToXML<Books>(book);return textBoxMsg.Text;}} }

執行“保存”操作之后,服務端拋出了如下錯誤信息:

?

總結

以上是生活随笔為你收集整理的WCF学习之旅—基于Fault Contract 的异常处理(十八)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜久久久久久久久久 | 国产乱子伦精品 | av有声小说一区二区三区 | 少妇精品久久久久久久久久 | 神马久久久久久久久久久 | 国产又粗又猛又爽又黄91精品 | 日韩综合在线观看 | 一区二区三区四区精品视频 | 俺也去综合 | 日韩综合在线视频 | 国产精品中文字幕在线观看 | 成年人网站免费看 | 又黄又刺激的视频 | 黄色一级视频 | 日本中文字幕不卡 | 91资源站 | 韩日视频 | 狠狠干在线视频 | 欧美激情在线免费 | 中文字幕少妇在线三级hd | 国产精品免费久久久 | 国内毛片视频 | 偷拍欧美亚洲 | 欧美色综合网 | 日韩视频免费在线观看 | 一二三区在线观看 | 色婷婷香蕉在线一区二区 | 日韩久久久久久 | 中文无码日韩欧 | 深夜福利视频在线观看 | 韩国三级在线视频 | 久久av一区二区三区亚洲 | 美女被草视频 | 成年网站在线 | 欧美乱人伦 | 欧美性猛交xxx乱久交 | 欧美小视频在线 | 美女国产精品 | 久久久无码精品亚洲国产 | 在线观看中文字幕2021 | 国产情侣av自拍 | 伊人av综合网 | 椎名空在线 | jiizzyou性欧美老片 | 亚洲AV无码成人精品区先锋 | 国产亚洲欧美日韩精品 | 国产丝袜视频 | 亚洲九九九 | 最近中文字幕mv免费高清在线 | 久久国产精品久久久久久电车 | 国产黄频在线观看 | 人人干人人干 | 午夜在线你懂的 | 熟女人妇 成熟妇女系列视频 | 麻豆自拍偷拍 | 亚洲图片三区 | 日本熟女毛茸茸 | 黄色av免费在线播放 | 国产黄色精品 | 久草在在线 | 精品国产乱码久久久久久88av | 天天干天天色 | 欧美色欧美色 | 成人av动漫 | 日日摸日日添日日躁av | 国产精品久久久久9999爆乳 | av一二三区 | 这里只有精品久久 | www.亚洲黄色 | 天堂成人在线视频 | 91亚洲精品乱码久久久久久蜜桃 | 亚州av综合色区无码一区 | 国产黄色在线免费观看 | 亚洲精品视频一区 | 国产老头和老头xxxx× | 小嫩嫩12欧美 | 久久久久人妻精品一区二区三区 | 国产无套内射又大又猛又粗又爽 | www.自拍 | 欧美一区二区三区久久成人精品 | 日韩中文字幕电影 | 久久久久久91亚洲精品中文字幕 | 国产伦精品一区二区三区视频1 | 变态另类一区二区 | 中日韩在线播放 | 中文字幕国产亚洲 | 久久精品www人人爽人人 | 五月天一区二区 | 毛片88| 在线免费中文字幕 | 精品一区二区三区精华液 | av日日操| 亚洲好骚综合 | 久久久久女人精品毛片九一 | 国产精品自偷自拍 | 国产精品久久久久久久久借妻 | 国产免费麻豆 | 爆操av | 影音先锋中文字幕资源 |