• WCF实现将服务器端的错误信息返回到客户端


    转载:http://www.cnblogs.com/zeroone/articles/2299001.html

            http://www.it165.net/pro/html/201403/11033.html

    最近在园子里转看到有人对如题的实现有疑问,今天有时间就写了项目把实现简单的讲解一下,如果你是牛逼人物那就绕道吧,哥不想浪费你的时间,现在开始:

    默认WCF是不允许将服务器的异常信息返回到客户端的(主要是客户端不一定能够识别clr的异常信息),如果你有这方面的需求可以通过SOAP的Fault包的形式返回异常信息,首先要做的就是设置配置文件,将默认不允许返回错误信息的设置改成如下:

    复制代码
        <behaviors>
    <serviceBehaviors>
    <behavior name="Bhc">
    <serviceMetadata httpGetEnabled="true"/>
    <serviceDebug includeExceptionDetailInFaults="true"/><!--如此設置會將服務器端得錯誤返回到客戶端,實際的發佈中需要將此項目設置成false-->
    </behavior>
    </serviceBehaviors>
    </behaviors>
    复制代码

    然后定义承载信息的DataContract

    复制代码
        [DataContract]
    public class Erro
    {
    [DataMember]
    public string Message
    {
    get; set;
    }
    }
    复制代码

    上边的代码 就不用介绍了 就是一个数据合同

    复制代码
        //服務契約定義了可以遠程調用的對象和方法
    //定義服務契約
    [XmlSerializerFormat]//定義序列化的方式
    [ServiceContract(SessionMode = SessionMode.Allowed)]//SessionMode = SessionMode.Allowed:設置此屬性意味著可以使用會話Binding
    public interface IActionMain
    {
    //定義操作契約
    [DataContractFormat]//定義序列化的方式
    [OperationContract]
    string GetName(string pInc);

    [FaultContract(typeof(ErroInfo.Erro))]//如果有異常就返回下面定義的數據契約的結構數據
    [FaultContract(typeof(DivideByZeroException))]
    [OperationContract]
    DataCollection Return();
    }
    复制代码

    在方法中定义属性,这里有两种实现

    1.使用自定义的错误类型
            [FaultContract(typeof(ErroInfo.Erro))]//如果有異常就返回下面定義的數據契約的結構數據

    2.使用系统的异常类型
            [FaultContract(typeof(DivideByZeroException))]
    在契约实现类中将异常抛出

    throw new FaultException<DivideByZeroException>(new DivideByZeroException("這個是自定義的異常!"));


    到此服务器端的实现完成。

    下边看客户端的实现

    配置文件不需要特殊设置,调用函数,抓取异常,代码如下:

    复制代码
                try
    {
    return this.Channel.Return();
    }
    catch (FaultException<ErroInfo.Erro> exception)
    {
    throw new Exception(exception.Detail.Message);
    }
    catch(FaultException<DivideByZeroException> exception)
    {
    throw new Exception(exception.Detail.Message);
    }
    复制代码

    FaultException<ErroInfo.Erro> exception:这个抓取的是定义的异常类型。

    FaultException<DivideByZeroException> exception:这个抓取的是系统异常类型

    注意这里获取异常的信息的方法是exception.Detail.Message,而不是Message。

    运行效果如下:

    示例代码:Demo

  • 相关阅读:
    流水线操作verilog
    16x16移位相加乘法器verilog实现
    Nios II对flash进行读写(DE2)
    initial使用的要点
    边沿检测电路设计verilog
    DDoS攻防战 (四):CC攻击防御系统部署
    DDoS攻防战(三):ip黑白名单防火墙frdev的原理与实现
    DDoS攻防战 (二) :CC攻击工具实现与防御理论
    DDoS攻防战 (一) : 概述
    IP流量重放与pcap文件格式解析
  • 原文地址:https://www.cnblogs.com/51net/p/4567946.html
Copyright © 2020-2023  润新知