分享
 
 
 

Web服务中的异常处理(3)

王朝other·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

既然我们已经了解了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

SoapExceptionsoapEx=newSoapException(errorMessage,

faultCodeLocation,uri,

rootNode);

//Raisetheexceptionbacktothecaller

returnsoapEx;

}

正如其名所提示的那样,RaiseException方法用于以SoapException对象的形式抛出Web服务中的异常。上面所示代码首先检查包含在FaultCode中的枚举参数的值,而该枚举参数用来标识异常发生的源头。如果是因为服务器端的问题(例如,数据库服务器已经关闭)而发生异常,那么应该设置FaultCode的值为SoapException.ServerFaultCode。接着,RaiseException方法创建一个XmlDocument对象来保存detail元素的内容。该对象添加detail元素下的所有子元素,然后把detail节点传递给SoapException对象的构造函数。最后,方法用return语句把SoapException对象返回给调用者。如果你检查SoapException对象内部的detail元素,你会发现它与下面内容有点类似。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有