惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
博客园 - 聂微东
Application and Cybersecurity Blog
Application and Cybersecurity Blog
MyScale Blog
MyScale Blog
罗磊的独立博客
H
Help Net Security
L
LangChain Blog
T
Threat Research - Cisco Blogs
量子位
S
Securelist
Last Week in AI
Last Week in AI
L
Lohrmann on Cybersecurity
T
The Exploit Database - CXSecurity.com
P
Privacy International News Feed
The Hacker News
The Hacker News
Vercel News
Vercel News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Blog of Author Tim Ferriss
T
Threatpost
Security Latest
Security Latest
P
Palo Alto Networks Blog
Microsoft Security Blog
Microsoft Security Blog
NISL@THU
NISL@THU
F
Full Disclosure
WordPress大学
WordPress大学
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Heimdal Security Blog
J
Java Code Geeks
Recorded Future
Recorded Future
Hugging Face - Blog
Hugging Face - Blog
G
GRAHAM CLULEY
Know Your Adversary
Know Your Adversary
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
阮一峰的网络日志
阮一峰的网络日志
U
Unit 42
B
Blog RSS Feed
月光博客
月光博客
C
Cisco Blogs
V
Visual Studio Blog
D
DataBreaches.Net
H
Hacker News: Front Page
博客园 - 叶小钗
N
News and Events Feed by Topic
爱范儿
爱范儿
A
Arctic Wolf

博客园 - 网际浪人

.Net Framework 4.0 中利用Task实现并行处理、串并行混合处理 C# Process调用应用程序失败时应注意的问题 程序员的幽默 To腾讯:强行收集用户个人隐私的行为不可饶恕 VS2005打开VS2008项目的2种方法(转) 【转】Oracle Conversion Functions 晨星、银河基金业绩排行榜数据转换工具 ORACLE纯SQL实现多行合并一行 ASP.NET项目添加Log4Net后,发布后无法写日志 “必应”不应、“谷歌”不歌 你好2009,再见2008,牛年犇犇犇 一种在SQLServer中实现Sequence的高效方法 oledb使用Access更新和插入操作的注意点 5.12大地震——小学二年级小表妹谢可欣的诗 GridView自动排序 [转]SQL Server 2005链接字符串 对HtmlEncode的增强——HtmlEntitiesEncode GridView中使用DataKeyNames存储数据键值 C#调用Excel VBA宏
封装SoapException处理Webservice异常
网际浪人 · 2008-02-28 · via 博客园 - 网际浪人

      Webservice客户端使用一个WebMethod时,如果WebMethod内部出现异常,不管异常是系统级异常或者自定义的异常,均会被包装为SoapException类型的异常,返回给客户端。 客户端再使用这种SoapException时,无法直接从异常类的属性中提取直接的业务异常信息。
     网上看到有同学是做了一个SoapException的Helper类,利用正则表达式的方式,从SoapException的属性做文法分析,从中提取业务异常信息。可是感觉这种方法不是很.Net,而且是不保险的一种做法,如果是自定义异常之类的,在做文法分析时可能会有隐患。而且不能更好的体现错误号。
     仔细研究了SoapException之后,发现它有个detail属性,可以利用这个Xml文档类型的节点实现较好的异常信息封包。

步骤如下:
一、(服务端)建立

SoapException 的封包方法

    /// <summary>
    
/// 异常类型
    
/// </summary>
    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;
    }

二、(服务端)WebMethod的异常处理中调用此方法。例如:

    /// <summary>
    
/// 根据ID读取人员信息
    
/// </summary>
    
/// <returns>人员信息类</returns>
    [WebMethod(Description = "根据ID读取人员信息")]
    
public PersonInfo WSReadPersonByID(int ID)
    {
        
try
        {
            PersonMethod personMethod 
= new PersonMethod();
            
return personMethod.ReadPersonByID(ID);
        }
        
catch (System.Exception ex)
        {
            
throw RaiseException(
                                    
"WSReadPersonByID",
                                    ex.Message,
                                    
"1000",
                                    ex.Source,
                                    FaultCode.Server
                                );
        }
    }

三、(客户端)建立SoapException的信息解析类

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Web.Services.Protocols;/// <summary>
/// SoapException 信息解析类
/// </summary>
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;
    }
}

四、(客户端)使用WebMethod时,使用 SoapException的信息解析类方法

    public PersonInfo ReadByID(int id)
    {
        
try
        {
            WSDemoService ws 
= new WSDemoService();
            ws.Credentials 
= System.Net.CredentialCache.DefaultCredentials;
            
return ws.WSReadPersonByID(id);
        }
        
catch (SoapException soapEx)
        {
            SoapExceptionInfo soapExInfo 
= new SoapExceptionInfo(soapEx);throw new System.Exception(soapExInfo.ErrorMessage);
        }
        
catch (Exception ex)
        {
            
throw ex;
        }
    }