WCF 入门(15)

前言

度过了一个阳光明媚的周末。

一个阴霾的周日夜晚。

第15集 WCF里面的异常处理(1)  Exception handling in WCF

大致看了一下,这个WCF视频里面总共有6集,这个是第一集,对WCF的异常做一个大致的入门介绍。

① 新建一个Demo, 命名为CalculatorService,里面只要一个OperationContract, Divide,如下。

    public class CalculatorService : ICalculatorService
    {
        public double Divide(int numerator, int denominator)
        {
            return numerator / denominator;
        }
    }

这里,我们默认不做任何异常处理,直接把他host起来。

② 新建一个aspx的Client来测试这个Service。代码也很简单,外加不加任何异常处理。

    protected void btnCalc_Click(object sender, EventArgs e)
    {
        var client = new CalculatorServiceClient();
        lbMsg.Text = client.Divide(
            int.Parse(tbNumerator.Text.Trim()),
            int.Parse(tbDenominator.Text.Trim())
            ).ToString();
    }

QQ截图20151018203545

分别在两个textbox里面输入被除数和除数,点计算按钮,右边显示结果。

③ 下面来测试一下如果除数为0,得到如下结果。

QQ截图20151018204031

貌似然并软,因为Error Message上看不到任何和除0有关的异常信息。客户端不晓得自己哪里错了。

这个是WCF的默认设置,出于系统安全性的考虑,服务端默认不会把Error Message 序列化为xml内容传给客户端,而是报了一个Common的WCF Fault Error。

因为如果客户端轻易的就知道了服务器上的internal error message,要hack就相对容易了一些。

但是出于调试的,我们有时候需要这个详细的错误信息内容。

④ 有两种方法可以让客户端知道具体的错误内容。

1. 修改配置文件 (推荐这种,因为改配置文件不需要重新编译Source Code)

      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>

如上,在ServiceDebug节点中增加includeExceptionDetailInFaults, 赋值为true。

2. 给 Class加特性,如下。

    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    public class CalculatorService : ICalculatorService
    {
        public double Divide(int numerator, int denominator)
        {
            return numerator / denominator;
        }
    }

我们给CalculatorService加了ServiceBehavior特性,并且给IncludeExceptionDetailInFaults 属性赋值 true。

⑤ 重新run Host, 再测试一次。

QQ截图20151018211316

这下就能看到除0错误了。

Thank you。

posted @ 2015-10-18 21:16  Sheldon_Lou  阅读(521)  评论(0编辑  收藏  举报