您的位置:首页 > 其它

WCF 入门 (18)

2015-10-31 11:22 211 查看

前言

感冒了呀。。。but 不忌油炸,不忌辛辣,o(∩_∩)o 。

第18集 WCF服务应该抛出fault 异常 Throwing fault exceptions from a WCF service

这集的中心意思是WCF服务如果有异常,应该throw出来fault exception,而不是简单的默认的.net 的异常。

原因有两个:

1. 一个未经处理的.net 异常会使当前的ServiceClient所在的channel进入faulted状态。然后当前的代理类就不能再用,需要重新create一个。但是fault exception不会。关于这个faulted state,可以看这里

2. 普通的.net 异常和平台相关,只能被.net的客户端识别,如果客户端是java的,就不好玩了。这个有点像.net remoting。

配置文件不变,是启用reliableSession的wsHttpBinding,Divide做如下改动:

public class CalculatorService : ICalculatorService
{
public double Divide(int numerator, int denominator)
{
if(denominator == 0) {
throw new FaultException(new FaultReason("denominator can't be 0"), new FaultCode("denominator is 0"));
}
return numerator / denominator;
}
}

手动判断除数是否为0,如果为0, throw一个 FaultException。FaultException用来表示一个基于xml的和平台无关的SOAP,这样就确保了客户端的平台无关性。





下面来试验一下效果:

1. host起这个service





2. 客户端代码不变,不过可以更新一下服务引用(试了不更新也没问题。)

3. 先试验除数为0的情况





其实前面抛出的FaultReason 和 FaultCode都是可以获取的。可以这么改:

lbRst.Text = ex.Code.Name + " - " + ex.Message;
lbRst.Text = ex.Code.Name + " - " + ex.Reason.ToString();

4, 如果没有在服务端throw FaultException,并且客户端没有create 一个new proxy instance,由于channel进入了Faulted状态,将无法再使用同一个ServiceClient。现在我们已经改成了FaultException,再试验了一下。





it works。

如果在实际的coding中,应该是在服务端的代码上加个大的try-catch块,然后在catch块中throw出一个FaultException。

Thank you.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: