这两天在研究Silverlight端如何捕获webService远程抛出的异常,没有太大进展,希望有了解的人能给我留言。以下是非silverlight的一般程序捕获webService端异常的做法:
1.在webservice端将抛出的一般异常封装成soapException
在这里,我们知道webService传递数据的方法是以xml格式的,故其异常也存在于xml文档中
public enum FaultCode
??????? {
??????????? Client = 0,
??????????? Server = 1
??????? }
??????? /// <summary>
??????? /// 封装异常为SoapException
??????? /// </summary>
??????? /// <param name="uri">引发异常的方法uri</param>
??????? /// <param name="errorMessage">错误信息</param>
??????? /// <param name="errorNumber">错误号</param>
??????? /// <param name="errorSource">错误源</param>
??????? /// <param name="code">异常类型</param>
??????? /// <returns>封装后的SoapException</returns>
??????? public SoapException RaiseException(
??????????????????????????????????????????????? string uri,
??????????????????????????????????????????????? string errorMessage,
??????????????????????????????????????????????? string errorNumber,
??????????????????????????????????????????????? string errorSource,
??????????????????????????????????????????????? FaultCode code
??????????????????????????????????????????? )
??????? {
??????????? //初始化限定名
??????????? XmlQualifiedName faultCodeLocation = null;
??????????? //异常类型代码转换
??????????? switch (code)
??????????? {
??????????????? case FaultCode.Client:
??????????????????? faultCodeLocation = SoapException.ClientFaultCode;
??????????????????? break;
??????????????? case FaultCode.Server:
??????????????????? faultCodeLocation = SoapException.ServerFaultCode;
??????????????????? break;
??????????? }
??????????? //构建异常信息结构体
??????????? string strXmlOut = @"<detail>"
???????????????????????????? + "<Error>"
???????????????????????????? + "<ErrorNumber>" + errorNumber + "</ErrorNumber>"
???????????????????????????? + "<ErrorMessage>" + errorMessage + "</ErrorMessage>"
???????????????????????????? + "<ErrorSource>" + errorSource + "</ErrorSource>"
???????????????????????????? + "</Error>"
???????????????????????????? + "</detail>";
??????????? //装载为Xml文档
??????????? XmlDocument xmlDoc = new XmlDocument();
??????????? xmlDoc.LoadXml(strXmlOut);
??????????? //实例化SoapException
??????????? SoapException soapEx = new SoapException(errorMessage,faultCodeLocation,uri,xmlDoc.DocumentElement);
??????????? //返回SoapException
??????????? return soapEx;
??????? }
2. 在webMethod内调用该封装方法,
??????? [WebMethod]
??????? public string HelloWorld()
??????? {
??????????? try
??????????? {
??????????????? throw new Exception("webService error");
??????????????? return "HelloWorld";
??????????? }
??????????? catch (System.Exception ex)
??????????? {
??????????????? throw RaiseException(
??????????????????????????????????????? "WSReadPersonByID",
??????????????????????????????????????? ex.Message,
??????????????????????????????????????? "1000",
??????????????????????????????????????? ex.Source,
??????????????????????????????????????? FaultCode.Server
??????????????????????????????????? );
??????????? }
??????? }
3.在客户端获得异常XML并解析
public class SoapExceptionInfo
??? {
??????? /// <summary>
??????? /// 错误号
??????? /// </summary>
??????? public string ErrorNumber = string.Empty;
??????? /// <summary>
??????? /// 错误信息
??????? /// </summary>
??????? public string ErrorMessage = string.Empty;
??????? /// <summary>
??????? /// 错误源
??????? /// </summary>
??????? public string ErrorSource = string.Empty;
??????? /// <summary>
??????? /// SoapExceptionInfo构造方法
??????? /// </summary>
??????? public SoapExceptionInfo()
??????? {
??????? }
??????? /// <summary>
??????? /// SoapExceptionInfo构造方法
??????? /// </summary>
??????? /// <param name="soapEx">SoapException</param>
??????? public SoapExceptionInfo(SoapException soapEx)
??????? {
??????????? XmlDocument doc = new XmlDocument();
??????????? doc.LoadXml(soapEx.Detail.OuterXml);
??????????? XmlNode categoryNode = doc.DocumentElement.SelectSingleNode("Error");
??????????? this.ErrorNumber = categoryNode.SelectSingleNode("ErrorNumber").InnerText;
??????????? this.ErrorMessage = categoryNode.SelectSingleNode("ErrorMessage").InnerText;
??????????? this.ErrorSource = categoryNode.SelectSingleNode("ErrorSource").InnerText;
??????? }
??? }
4.在客户端捕获异常
public Form1()??????? {??????????? InitializeComponent();??????????? ServiceReference1.Service1SoapClient t = new wfTest.ServiceReference1.Service1SoapClient();??????????? try??????????? {??????????????? label1.Text = t.HelloWorld();??????????? }??????????? catch (SoapException ex)??????????? {??????????????? SoapExceptionInfo s = new SoapExceptionInfo(ex);??????????????? ??????????????? label1.Text = s.ErrorMessage;??????????????? //label1.Text = ex.Message;??????????? }??????????? catch(Exception e)??????????? {??????????????? label1.Text = e.Message;??????????? }??????? }