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