微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过SoapException捕获Webservice异常

这两天在研究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;            }        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐