在客户端中调用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);
}