Web服務中的異常處理(3)
發表于:2007-05-25來源:作者:點擊數:
標簽:
既然我們已經了解了AddCategories方法,現在就讓我們來看看AddCategories方法所用到的助手方法。首先,我們看看ValidateXml方法。像前面所提到的那樣,該方法負責確保被添加的CategoriesXML數據遵從Categories.xsd中所預先定義好的XML模式。 privateboolVali
既然我們已經了解了AddCategories方法,現在就讓我們來看看AddCategories方法所用到的助手方法。首先,我們看看ValidateXml方法。像前面所提到的那樣,該方法負責確保被添加的CategoriesXML數據遵從Categories.xsd中所預先定義好的XML模式。
privateboolValidateXml(stringxml)
{
boolvalidXml=false;
//LoadtheXMLdataintomemory
XmlValidatingReadervalReader=new
XmlValidatingReader(xml,XmlNodeType.Document,null);
valReader.Schemas.Add(null,Server.MapPath("Categories.xsd"));
valReader.ValidationType=ValidationType.Schema;
valReader.ValidationEventHandler+=new
ValidationEventHandler(ValidationHandler);
//LoopthroughtheXMLfile
while(valReader.Read())
{}
if(builder.Length>0)
validXml=false;
else
validXml=true;
valReader.Close();
returnvalidXml;
}
以上代碼首先把被添加的XML數據傳遞給構造函數,創建一個XmlValidatingReader類實例。然后,把Categories.xsd添加到XmlValidatingReader對象的Schemas集合中。接著,設置ValidationType為ValidationType.Schema,表明我們是在根據XML模式來驗證XML數據。當你在使用XmlValidatingReader類驗證XML數據時,你必須創建一個事件處理對象,并把它與ValidationEventHandler事件相關聯。一旦做完這些后,校驗錯誤和警告就通過這個回調事件處理對象被報告出來。ValidationEventHandler具有一個ValidationEventArgs類型的參數。ValidationEventArgs類提供兩個重要屬性,Message和Serverity。這兩個屬性提供更多的有關于校驗錯誤的信息。
在這種情況下,我們把ValidationEventHandler事件與ValidationHandler方法相關聯。在這個方法中,我們附加錯誤信息到StringBuilder對象中,而該StringBuilder對象定義在模塊中。如果沒有任何校驗錯誤,那么StringBuilder對象的Length屬性將返回0。我們就是使用這個來檢查XML模式校驗是否失敗。ValidationHandler方法定義如下。
publicvoidValidationHandler(objectsender,
ValidationEventArgsargs)
{
builder.Append("Validationerror"+"
");
builder.Append("Severity:"+args.Severity+"
");
builder.Append("Message:"+args.Message+"
");
}
下面,讓我們來看看RaiseException方法的代碼。
publicSoapExceptionRaiseException(stringuri,
stringwebServiceNamespace,
stringerrorMessage,
stringerrorNumber,
stringerrorSource,
FaultCodecode)
{
XmlQualifiedNamefaultCodeLocation=null;
//IdentifythelocationoftheFaultCode
switch(code)
{
caseFaultCode.Client:
faultCodeLocation=SoapException.ClientFaultCode;
break;
caseFaultCode.Server:
faultCodeLocation=SoapException.ServerFaultCode;
break;
}
XmlDocumentxmlDoc=newXmlDocument();
//CreatetheDetailnode
XmlNoderootNode=xmlDoc.CreateNode(XmlNodeType.Element,
SoapException.DetailElementName.Name,
SoapException.DetailElementName.Namespace);
//BuildspecificdetailsfortheSoapException
//AddfirstchildofdetailXMLelement.
XmlNodeerrorNode=xmlDoc.CreateNode(XmlNodeType.Element,"Error",
webServiceNamespace);
//CreateandsetthevaluefortheErrorNumbernode
XmlNodeerrorNumberNode=
xmlDoc.CreateNode(XmlNodeType.Element,"ErrorNumber",
webServiceNamespace);
errorNumberNode.InnerText=errorNumber;
//CreateandsetthevaluefortheErrorMessagenode
XmlNodeerrorMessageNode=xmlDoc.CreateNode(XmlNodeType.Element,
"ErrorMessage",
webServiceNamespace);
errorMessageNode.InnerText=errorMessage;
//CreateandsetthevaluefortheErrorSourcenode
XmlNodeerrorSourceNode=
xmlDoc.CreateNode(XmlNodeType.Element,"ErrorSource",
webServiceNamespace);
errorSourceNode.InnerText=errorSource;
//AppendtheErrorchildelementnodestotherootdetailnode.
errorNode.AppendChild(errorNumberNode);
errorNode.AppendChild(errorMessageNode);
errorNode.AppendChild(errorSourceNode);
//AppendtheDetailnodetotherootnode
rootNode.AppendChild(errorNode);
//Constructtheexception
SoapException
soapEx=newSoapException(errorMessage,
faultCodeLocation,uri,
rootNode);
//Raisetheexceptionbacktothecaller
returnsoapEx;
}
正如其名所提示的那樣,RaiseException方法用于以SoapException對象的形式拋出Web服務中的異常。上面所示代碼首先檢查包含在FaultCode中的枚舉參數的值,而該枚舉參數用來標識異常發生的源頭。如果是因為
服務器端的問題(例如,
數據庫服務器已經關閉)而發生異常,那么應該設置FaultCode的值為SoapException.ServerFaultCode。接著,RaiseException方法創建一個XmlDocument對象來保存detail元素的內容。該對象添加detail元素下的所有子元素,然后把detail節點傳遞給SoapException對象的構造函數。最后,方法用return語句把SoapException對象返回給調用者。如果你檢查SoapException對象內部的detail元素,你會發現它與下面內容有點類似。
1000
ExceptionInformation
ExceptionSource
當客戶應用程序接收到Web服務的異常時,它可以查看SoapException對象的Detail屬性以獲取更多的有關于已產生的異常的信息。
使用SoapException的優點:
使用SoapException類把異常信息返回給Web服務的客戶端,這種方法具有很多的優點。如下:
能夠以一致的方式來處理異常情況
基于
SOAP規范
通過顯示的產生異常,這可以傳達更多的信息,例如,異常原因,Web服務方法的URL等等(使用諸如Actor、Code和Detail之類的屬性)
使用FaultCode,可以清楚地表示異常歸因于客戶端還是服務器端
使用Detail屬性,可以更詳細地描述異常信息
原文轉自:http://www.kjueaiud.com
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
|