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(); }
分别在两个textbox里面输入被除数和除数,点计算按钮,右边显示结果。
③ 下面来测试一下如果除数为0,得到如下结果。
貌似然并软,因为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, 再测试一次。
这下就能看到除0错误了。
Thank you。