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

  • 相关阅读:
    Unity3D 5.3 新版AssetBundle使用方案及策略
    解构C#游戏框架uFrame兼谈游戏架构设计
    漫谈C#编程语言在游戏领域的应用
    TDD在Unity3D游戏项目开发中的实践
    趣说游戏AI开发:曼哈顿街角的A*算法
    “为什么DirectX里表示三维坐标要建一个4*4的矩阵?”
    趣说游戏AI开发:对状态机的褒扬和批判
    使用TypeScript拓展你自己的VS Code!
    MVP社区巡讲-云端基础架构:12月5日北京站 12月12日上海站
    【转】Spring Boot干货系列:(一)优雅的入门篇
  • 原文地址:https://www.cnblogs.com/51net/p/4567946.html
Copyright © 2011-2022 走看看