C#开发之Web Service的异常处理(一)

本文介绍了在C#开发中,针对Web Service的异常处理,特别是客户端请求服务时可能遇到的网络中断、执行错误等问题。强调了异常处理的重要性,包括在网络中断时客户端如何捕获并提示用户,以及服务端通过定义XML返回值标准来传递错误信息给客户端。文章以查询和添加/删除/修改操作为例,展示了正常与异常情况下的XML返回结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际开发中,web service的使用变得日益普及,特别是在移动互联网上,移动终端响应与请求数据往往是连接web service得到的。往往web service发布在服务器端,也有可能发布在其他地方,总之是与客户端相分离的。
所以,客户端请求web服务的异常处理与本地操作的异常处理是不同的。按照原理来说,web服务的传递参数是以XML为格式的。
客户端请求web服务有三种情况:
1.web服务没有响应。
2.请求数据在执行过程中发生异常,导致执行错误。
3.得到正确的执行结果。
web服务没有响应原因可能是网络中断或web服务没有启动。
执行异常,有可能是SQL指令错误或参数错误或者是其他程序异常等。
web服务没有响应的异常,可以在客户端请求web服务时捕获到,即try{}catch{MessageBox.Show("网络中断,请稍后再试!");}。
web服务中程序的异常的处理可以分为两种情况:
1.定义一组返回值标准,直接将错误信息抛给客户端。
2.记录到web日志中,同时客户端捕获异常。
本次博客只写第一种情况。
异常的抛出主要为了在程序出现问题时方便调试使用的或者尽量避免不必要的异常处理,使程序更严谨、健壮。
按照对数据的操作,分成查询、添加/删除/修改两种情况说明:
1.查询时:
若查询正常,则返回正常结果,例如结构如下:

<?xml version="1.0" encoding="GB2312" ?> 
 <NewDataSet>
 <STUDENT>
  <SERIAL_NO>232</SERIAL_NO> 
  <DEPT_CODE>2029</DEPT_CODE> 
  <DEPT_NAME>化工学院</DEPT_NAME> 
  </STUDENT>
  <STUDENT>
  <SERIAL_NO>232</SERIAL_NO> 
  <DEPT_CODE>2029</DEPT_CODE> 
  <DEPT_NAME>化工学院</DEPT_NAME> 
  </STUDENT>
 </NewDataSet>

若出现异常,如下:

<?xml version="1.0" encoding="GB2312" ?> 
 <NewDataSet>
 <Exception>
  <Exception_Flag>1</Exception_Flag> 
  <Exception_Value>没有查询到结果</Exception_Value> 
  <Exception_Error>没有查询到结果!</Exception_Error> 
  </Exception>
 </NewDataSet>

2. 添加/删除/修改成功时,返回结构也定义成xml格式如下:

<?xml version="1.0" encoding="GB2312" ?> 
 <NewDataSet>
 <Exception>
  <Exception_Flag>0</Exception_Flag> 
  <Exception_Value>执行成功</Exception_Value> 
  <Exception_Error></Exception_Error> 
  </Exception>
 </NewDataSet>

 若失败,有异常时,格式如下:

<?xml version="1.0" encoding="GB2312" ?> 
 <NewDataSet>
 <Exception>
  <Exception_Flag>2</Exception_Flag> 
  <Exception_Value>操作发生异常</Exception_Value> 
  <Exception_Error>Exception.message()</Exception_Error> 
  </Exception>
 </NewDataSet>

以上是web服务端的返回值,即请求web服务都会返回xml文档,解析后知道操作是否成功,有无异常。
程序解析如下:

public static List<STUDENT> GetSTUDENT(string strXml, out int flag, out string strValue, out string strError)
        {
            flag = 0;
            strValue = "";
            strError = "";
            List<STUDENT> lstSTUDENT = new List<STUDENT>();
            //Xml解析
            XmlDocument doc = new XmlDocument();
            //加载XML字符串
            doc.LoadXml(strXml);

            XmlNodeList xxList = doc.GetElementsByTagName("NewDataSet"); //取得节点名为NewDataSet的集合


            foreach(XmlNode fatherNode in xxList)
            {
                XmlNodeList childList = fatherNode.ChildNodes;

                foreach(XmlNode xxNode in childList)//一个Object集合
                {

                    STUDENT STUDENT = new STUDENT();
                    XmlNodeList childList2 = xxNode.ChildNodes;

                    foreach(XmlNode node in childList2)
                    {
                        String temp = node.Name;
                        switch(temp)
                        {
                            
                            case "NAME":     //姓名
                                STUDENT.Name = node.InnerText;
                                break;
                            case "SEX"://性别
                                STUDENT.Sex = node.InnerText;
                                break;
                            case "DATE_OF_BIRTH"://出生日期
                                STUDENT.Date_Of_Birth = DateTime.Parse(node.InnerText);
                                break;
                            case "NATION"://民族
                                STUDENT.Nation = node.InnerText;
                                break;
                            case "IDENTITY"://身份
                                STUDENT.Identity = node.InnerText;
                                break;
                           

                            case "Exception_Flag"://异常标识
                                flag = Int32.Parse(node.InnerText);
                                break;
                            case "Exception_Value"://异常提示
                                strValue = node.InnerText;
                                break;
                            case "Exception_Error"://异常详细描述
                                strError = node.InnerText;
                                break;
                            default:
                                break;
                        }
                    }
                    lstSTUDENT.Add(STUDENT);
                }
            }
            return lstSTUDENT;
        } 



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值