zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    hdu 4002 Find the maximum
    hdu 2837 坑题。
    hdu 3123
    zoj Treasure Hunt IV
    hdu 2053 Switch Game 水题一枚,鉴定完毕
    poj 1430 Binary Stirling Numbers
    hdu 3037 Saving Beans
    hdu 3944 dp?
    南阳oj 求N!的二进制表示最低位的1的位置(从右向左数)。
    fzu 2171 防守阵地 II
  • 原文地址:https://www.cnblogs.com/51net/p/4567946.html
Copyright © 2011-2022 走看看