.NET开发

本类阅读TOP10

·NHibernate快速指南(翻译)
·vs.net 2005中文版下载地址收藏
·【小技巧】一个判断session是否过期的小技巧
·VB/ASP 调用 SQL Server 的存储过程
·?dos下编译.net程序找不到csc.exe文件
·通过Web Services上传和下载文件
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·VB.NET实现DirectDraw9 (2) 动画
·VB.NET实现DirectDraw9 (1) 托管的DDraw
·建站框架规范书之——文件命名

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
在WebService中利用SoapException处理业务流程执行的错误

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

        在客户端中调用WebService的方法处理业务流程,如果业务处理程序返回错误,一般我们可以利用返回错误码的方式将处理结果返回给客户段,客户段针对不同的错误码进行相应的错误处理,按照这种处理流程有时候客户端可能需要很多重复的代码来响应不同的错误码,一个简单的例子就是,对于不同的错误码,显示不同的错误消息,有些系统中,业务处理的错误消息可能是放在业务数据库中的,在这种情况下,客户段要显示错误消息,还必须要调用相应的Service获取错误消息。
        WebService利用SoapException的Detail提供了给客户端返回更详细错误信息、或业务相关信息的能力,例如在一个认证的例子中可以利用下面代码给客户段返回异常,并告知客户错误码和错误消息,以及其他相关信息
  private static int Authenticate( CredentialSoapHeader header)
  {
   int iRet ;

   try
   {
    SqlConnection conn = new SqlConnection(CommonDB.ConnectionString);
    SqlCommand cmd = new SqlCommand("P_Employee_Check", conn);
    cmd.Parameters.Add("@EmployeeCode", header.Username);
    cmd.Parameters.Add("@EmployeePassword", header.Password);
    cmd.Parameters.Add("@ReturnValue",-1) ;
    cmd.Parameters["@ReturnValue"].Direction = ParameterDirection.ReturnValue ;
    cmd.CommandType = CommandType.StoredProcedure;
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
    iRet = Convert.ToInt32(cmd.Parameters["@ReturnValue"].Value) ;

   }
   catch (Exception ex)
   {
    iRet = 1000 ;
    throw new SoapException(string.Empty, SoapException.ServerFaultCode, "Service",ErrorMessage.CreateSoapExDetail(iRet , "数据库操作产生异常.\n"+ex.Message));
   }
   //检查返回码
   if (iRet!=0)
   {
    throw new SoapException(string.Empty, SoapException.ClientFaultCode, "Service",ErrorProcess.CreateSoapExDetail(iRet,""));
   }
     
   return iRet ;
  }

生成SoapException的Detail的代码如下:
  public static System.Xml.XmlNode CreateSoapExDetail(int ExCode,string strMessage)
  {
   XmlDocument doc = new System.Xml.XmlDocument();
   XmlNode node = doc.CreateNode(XmlNodeType.Element,
    SoapException.DetailElementName.Name,
    SoapException.DetailElementName.Namespace);


   // 增加错误码
   System.Xml.XmlNode NodeCode = doc.CreateNode(XmlNodeType.Element,"ExCode","ExCode");
   NodeCode.InnerText = ExCode.ToString() ;
           
   // 增加错误消息
   System.Xml.XmlNode NodeMessage = doc.CreateNode(XmlNodeType.Element,"ExMessage", "ExMessage");
   if(strMessage.Trim()=="")
   {
    NodeMessage.InnerText = GetErrorMessage(ExCode) ;//根据从数据库中取相应的错误消息
   }
   else
   {
    NodeMessage.InnerText = strMessage ;
   }

   // Append the two child elements to the detail node.
   node.AppendChild(NodeCode);
   node.AppendChild(NodeMessage);
   return node ;
  }

客户端补获SoapException后处理方法如下:
   catch (SoapException soapEx)
   {
    iRet = Convert.ToInt32(soapEx.Detail["ExCode"].InnerText) ;
    MessageBox.Show(soapEx.Detail["ExMessage"].InnerText, "服务端错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

   }




相关文章

相关软件