前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WCF实现将服务器端的错误信息返回到客户端

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

作者头像
跟着阿笨一起玩NET
发布2018-09-20 15:10:04
1.1K0
发布2018-09-20 15:10:04
举报

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

2011-12-21 11:37 by Ref Tian, 398 visits, 收藏, 编辑

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

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

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

然后定义承载信息的DataContract

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

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

代码语言:javascript
复制
    //服務契約定義了可以遠程調用的對象和方法
    //定義服務契約
    [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))] 在契约实现类中将异常抛出

代码语言:javascript
复制
throw new FaultException<DivideByZeroException>(new DivideByZeroException("這個是自定義的異常!"));

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

下边看客户端的实现

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

代码语言:javascript
复制
            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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2011-12-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • WCF实现将服务器端的错误信息返回到客户端
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档