日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

4 Web服務(wù)中的異常處理

【4 Web服務(wù)中的異常處理】客戶端的異常處理
這個部分,我們將看看在客戶端怎樣處理從Web服務(wù)中所拋出的異常 。為了說明這個做法,我們來創(chuàng)建一個新項目CategoriesServiceClient 。一旦項目被創(chuàng)建,就在默認(rèn)的表單上添加一個命令按鈕,并命名為btnInvoke 。因為需要在客戶端引用Web服務(wù),所以在項目CategoriesService中添加一個WebReference ??梢酝ㄟ^Project->AddReference菜單選項來完成添加 。然后修改命令按鈕的Click事件,如下所示 。
privatevoidbtnInvoke_Click(objectsender,System.EventArgse)
{
try
{
Categoriescat=newCategories();
MessageBox.Show(cat.AddCategories("
TestCategory
TestCategoryDescription
").ToString());
}
catch(SoapExceptionsoapEx)
{
MessageBox.Show(soapEx.Code.ToString());
//LoadtheDetailelementoftheSoaopExceptionobject
XmlDocumentdoc=newXmlDocument();
doc.LoadXml(soapEx.Detail.OuterXml);
XmlNamespaceManagernsManager=new
XmlNamespaceManager(doc.NameTable);
//AddthenamespacetotheNamespaceManager
nsManager.AddNamespace("errorNS",
"http://tempuri.org/CategoriesService");
XmlNodecategoryNode=
doc.DocumentElement.SelectSingleNode("errorNS:Error",
nsManager);
stringerrorNumber=
categoryNode.SelectSingleNode("errorNS:ErrorNumber",
nsManager).InnerText;
stringerrorMessage=
categoryNode.SelectSingleNode("errorNS:ErrorMessage",
nsManager).InnerText;
stringerrorSource=
categoryNode.SelectSingleNode("errorNS:ErrorSource",
nsManager).InnerText;
MessageBox.Show("ErrorNumberis" errorNumber);
MessageBox.Show("ErrorMessageis" errorMessage);
MessageBox.Show("ErrorSourceis" errorSource);
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
客戶端需要處理Web服務(wù)所產(chǎn)生的異常 。因為Web服務(wù)所產(chǎn)生的異常都是SoapException形式的,所以調(diào)用Web服務(wù)的客戶應(yīng)用程序的代碼應(yīng)該被包含在try...catch塊中,并且第一個catch塊應(yīng)該具有捕捉SoapException的處理器 。讓我們大致看看以上所示的代碼 。
首先創(chuàng)建一個Categories類的實(shí)例 。然后傳入所要求的XML字符串參數(shù),調(diào)用Categories類的AddCategories方法 。再后,我們讓catch塊處理Web服務(wù)所產(chǎn)生的異常 。在這個代碼塊中,我們以消息提示框的方式顯示異常的產(chǎn)生者 。我們通過使用SoapException對象的Code屬性來完成這個顯示 。如果異常是因為客戶端的非法輸入而產(chǎn)生的,那么Code屬性被設(shè)置為Client 。如果異常是因為Web服務(wù)代碼(例如,據(jù)庫服務(wù)器已經(jīng)關(guān)閉)而產(chǎn)生的,則Code屬性被設(shè)為Server 。
然后,我們把包含在SoapException對象的Detail元素中的XML數(shù)據(jù)導(dǎo)入到一個XmlDocument對象中 。類似于Web服務(wù)的代碼,這里同樣利用XmlNamespaceManager對象把命名空間與XmlDocument對象關(guān)聯(lián)在一起 。之后,取出包含在不同元素中的值,并把它們賦給本地變量 。最后,使用消息提示框顯示本地變量的值 。
把它放在一起
至此,我們已經(jīng)完成了客戶應(yīng)用程序,現(xiàn)在讓我們運(yùn)行測試它 。如果運(yùn)行客戶程序,它將顯示一個消息框(具有true值),那么則表明categories詳細(xì)信息已經(jīng)成功保存到數(shù)據(jù)庫中 。現(xiàn)在,從輸入的XML數(shù)據(jù)中刪除元素,運(yùn)行客戶程序 。將會得到一個消息,表明異常的原因是客戶程序,除此之外,還可以在SoapException對象中得到更多的異常信息 。
正如前面所提到的那樣,如果Web服務(wù)失敗是由于服務(wù)器端的一些問題引起的,那么SoapException對象的Code屬性應(yīng)該被設(shè)置為Server 。為了測試這個,修改Web服務(wù)中的連接字符串為一個無效值 ?,F(xiàn)在,如果運(yùn)行客戶程序,將會得到一個表明異常的原因是Server的消息(該例中的Web服務(wù)) 。

推薦閱讀