转自http://www.cnblogs.com/heekui/archive/2008/02/28/1084312.html
Webservice客户端使用一个WebMethod时,如果WebMethod内部出现异常,不管异常是系统级异常或者自定义的异常,均会被包装为SoapException类型的异常,返回给客户端。 客户端再使用这种SoapException时,无法直接从异常类的属性中提取直接的业务异常信息。
网上看到有同学是做了一个SoapException的Helper类,利用正则表达式的方式,从SoapException的属性做文法分析,从中提取业务异常信息。可是感觉这种方法不是很.Net,而且是不保险的一种做法,如果是自定义异常之类的,在做文法分析时可能会有隐患。而且不能更好的体现错误号。
仔细研究了SoapException之后,发现它有个detail属性,可以利用这个Xml文档类型的节点实现较好的异常信息封包。
步骤如下:
一、(服务端)建立 SoapException 的封包方法
///<summary>
///异常类型
///</summary>
publicenumFaultCode
{
Client=0,
Server=1
}
///<summary>
///封装异常为SoapException
///</summary>
///<paramname="uri">引发异常的方法uri</param>
///<paramname="errorMessage">错误信息</param>
///<paramname="errorNumber">错误号</param>
///<paramname="errorSource">错误源</param>
///<paramname="code">异常类型</param>
///<returns>封装后的SoapException</returns>
publicSoapExceptionRaiseException(
stringuri,
stringerrorMessage,
stringerrorNumber,
stringerrorSource,
FaultCodecode
)
{
//初始化限定名
XmlQualifiedNamefaultCodeLocation=null;
//异常类型代码转换
switch(code)
{
caseFaultCode.Client:
faultCodeLocation=SoapException.ClientFaultCode;
break;
caseFaultCode.Server:
faultCodeLocation=SoapException.ServerFaultCode;
break;
}
//构建异常信息结构体
stringstrXmlOut=@"<detail>"
+"<Error>"
+"<ErrorNumber>"+errorNumber+"</ErrorNumber>"
+"<ErrorMessage>"+errorMessage+"</ErrorMessage>"
+"<ErrorSource>"+errorSource+"</ErrorSource>"
+"</Error>"
+"</detail>";
//装载为Xml文档
XmlDocumentxmlDoc=newXmlDocument();
xmlDoc.LoadXml(strXmlOut);
//实例化SoapException
SoapExceptionsoapEx=newSoapException(errorMessage,faultCodeLocation,uri,xmlDoc.DocumentElement);
//返回SoapException
returnsoapEx;
}
二、(服务端)WebMethod的异常处理中调用此方法。例如:
///<summary>
///根据ID读取人员信息
///</summary>
///<returns>人员信息类</returns>
[WebMethod(Description="根据ID读取人员信息")]
publicPersonInfoWSReadPersonByID(intID)
{
try
{
PersonMethodpersonMethod=newPersonMethod();
returnpersonMethod.ReadPersonByID(ID);
}
catch(System.Exceptionex)
{
throwRaiseException(
"WSReadPersonByID",
ex.Message,
"1000",
ex.Source,
FaultCode.Server
);
}
}
三、(客户端)建立SoapException的信息解析类
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Xml;
usingSystem.Web.Services.Protocols;
///<summary>
///SoapException信息解析类
///</summary>
publicclassSoapExceptionInfo
{
///<summary>
///错误号
///</summary>
publicstringErrorNumber=string.Empty;
///<summary>
///错误信息
///</summary>
publicstringErrorMessage=string.Empty;
///<summary>
///错误源
///</summary>
publicstringErrorSource=string.Empty;
///<summary>
///SoapExceptionInfo构造方法
///</summary>
publicSoapExceptionInfo()
{
}
///<summary>
///SoapExceptionInfo构造方法
///</summary>
///<paramname="soapEx">SoapException</param>
publicSoapExceptionInfo(SoapExceptionsoapEx)
{
XmlDocumentdoc=newXmlDocument();
doc.LoadXml(soapEx.Detail.OuterXml);
XmlNodecategoryNode=doc.DocumentElement.SelectSingleNode("Error");
this.ErrorNumber=categoryNode.SelectSingleNode("ErrorNumber").InnerText;
this.ErrorMessage=categoryNode.SelectSingleNode("ErrorMessage").InnerText;
this.ErrorSource=categoryNode.SelectSingleNode("ErrorSource").InnerText;
}
}
四、(客户端)使用WebMethod时,使用 SoapException的信息解析类方法
publicPersonInfoReadByID(intid)
{
try
{
WSDemoServicews=newWSDemoService();
ws.Credentials=System.Net.CredentialCache.DefaultCredentials;
returnws.WSReadPersonByID(id);
}
catch(SoapExceptionsoapEx)
{
SoapExceptionInfosoapExInfo=newSoapExceptionInfo(soapEx);
thrownewSystem.Exception(soapExInfo.ErrorMessage);
}
catch(Exceptionex)
{
throwex;
}
}
Webservice客户端使用一个WebMethod时,如果WebMethod内部出现异常,不管异常是系统级异常或者自定义的异常,均会被包装为SoapException
仔细研究了SoapException
步骤如下:
一、(服务端)建立 SoapException
///<summary>
///异常类型
///</summary>
publicenumFaultCode
{
Client=0,
Server=1
}
///<summary>
///封装异常为SoapException
///</summary>
///<paramname="uri">引发异常的方法uri</param>
///<paramname="errorMessage">错误信息</param>
///<paramname="errorNumber">错误号</param>
///<paramname="errorSource">错误源</param>
///<paramname="code">异常类型</param>
///<returns>封装后的SoapException</returns>
publicSoapExceptionRaiseException(
stringuri,
stringerrorMessage,
stringerrorNumber,
stringerrorSource,
FaultCodecode
)
{
//初始化限定名
XmlQualifiedNamefaultCodeLocation=null;
//异常类型代码转换
switch(code)
{
caseFaultCode.Client:
faultCodeLocation=SoapException.ClientFaultCode;
break;
caseFaultCode.Server:
faultCodeLocation=SoapException.ServerFaultCode;
break;
}
//构建异常信息结构体
stringstrXmlOut=@"<detail>"
+"<Error>"
+"<ErrorNumber>"+errorNumber+"</ErrorNumber>"
+"<ErrorMessage>"+errorMessage+"</ErrorMessage>"
+"<ErrorSource>"+errorSource+"</ErrorSource>"
+"</Error>"
+"</detail>";
//装载为Xml文档
XmlDocumentxmlDoc=newXmlDocument();
xmlDoc.LoadXml(strXmlOut);
//实例化SoapException
SoapExceptionsoapEx=newSoapException(errorMessage,faultCodeLocation,uri,xmlDoc.DocumentElement);
//返回SoapException
returnsoapEx;
}
二、(服务端)WebMethod的异常处理中调用此方法。例如:
///<summary>
///根据ID读取人员信息
///</summary>
///<returns>人员信息类</returns>
[WebMethod(Description="根据ID读取人员信息")]
publicPersonInfoWSReadPersonByID(intID)
{
try
{
PersonMethodpersonMethod=newPersonMethod();
returnpersonMethod.ReadPersonByID(ID);
}
catch(System.Exceptionex)
{
throwRaiseException(
"WSReadPersonByID",
ex.Message,
"1000",
ex.Source,
FaultCode.Server
);
}
}
三、(客户端)建立SoapException
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Xml;
usingSystem.Web.Services.Protocols;
///<summary>
///SoapException信息解析类
///</summary>
publicclassSoapExceptionInfo
{
///<summary>
///错误号
///</summary>
publicstringErrorNumber=string.Empty;
///<summary>
///错误信息
///</summary>
publicstringErrorMessage=string.Empty;
///<summary>
///错误源
///</summary>
publicstringErrorSource=string.Empty;
///<summary>
///SoapExceptionInfo构造方法
///</summary>
publicSoapExceptionInfo()
{
}
///<summary>
///SoapExceptionInfo构造方法
///</summary>
///<paramname="soapEx">SoapException</param>
publicSoapExceptionInfo(SoapExceptionsoapEx)
{
XmlDocumentdoc=newXmlDocument();
doc.LoadXml(soapEx.Detail.OuterXml);
XmlNodecategoryNode=doc.DocumentElement.SelectSingleNode("Error");
this.ErrorNumber=categoryNode.SelectSingleNode("ErrorNumber").InnerText;
this.ErrorMessage=categoryNode.SelectSingleNode("ErrorMessage").InnerText;
this.ErrorSource=categoryNode.SelectSingleNode("ErrorSource").InnerText;
}
}
四、(客户端)使用WebMethod时,使用 SoapException
publicPersonInfoReadByID(intid)
{
try
{
WSDemoServicews=newWSDemoService();
ws.Credentials=System.Net.CredentialCache.DefaultCredentials;
returnws.WSReadPersonByID(id);
}
catch(SoapExceptionsoapEx)
{
SoapExceptionInfosoapExInfo=newSoapExceptionInfo(soapEx);
thrownewSystem.Exception(soapExInfo.ErrorMessage);
}
catch(Exceptionex)
{
throwex;
}
}
浙公网安备 33010602011771号