您的位置:首页 > 其它

艾伟:WCF从理论到实践(10):异常处理

2011-08-29 00:09 344 查看

本系列文章导航

WCF从理论到实践(1):揭开神秘面纱

WCF从理论到实践(2):决战紫禁之巅

WCF从理论到实践(3):八号当铺之黑色契约

WCF从理论到实践(4):路在何方

WCF从理论到实践(5):Binding细解

WCF从理论到实践(6):WCF架构

WCF从理论到实践(7):消息交换模式

WCF从理论到实践(8):事件广播

WCF从理论到实践(9):实例模式和对象生命周期

WCF从理论到实践(10):异常处理

WCF从理论到实践(11)-异步

WCF从理论到实践(12):事务

WCF从理论到实践(13):事务投票

WCF从理论到实践(14):WCF解决方案模板

WCF从理论到实践(15):响应变化

WCF从理论到实践(16):操作重载(带视频+ppt+源码)

WCF从理论到实践(17):OO大背离(带视频+ppt+源码)

本文目的

通过阅读本文,您能理解以下的知识

1) WCF中存在哪几种异常处理方式?

2) 各种异常处理所适用的应用场合?

3) WCF中常见的异常类型?

4) 代码不骗人,用示例来演示效果,加深印象

本文适合的读者

本文适合WCF的初学者,但要求对WCF有一些了解,并实现过简单的服务/客户端。



WCF中存在哪几种异常处理方式?


WCF定义了几种异常处理模型,它们分别如下:

1) 缺省模式

2) 包含详细信息模式

3) 自定义异常消息模式

各种异常处理所适用的应用场合?

1) 缺省模式

缺省情况下,服务端发生异常,客户端会得到一个缺省的Exception,但这个Exception实例中并不包括详细的异常信息。只是告诉客户端服务端不能正常工作。在服务器和客户端模式的程序中,有些情况下,服务启是不能完全信赖客户端的,比如浏览器和web服务器之间,为了防止非法的客户端从异常消息中获取服务端的比较详细的信息,使得心怀叵测之人有机可乘,所以服务启对于异常 返回通常会比较模糊。WCF也采用了这种做法,缺省情况下,它返回给客户端的异常只告知我出错了,但不告诉人家他哪里错了。这通常应用于客户端来源不明的生产环境,以此保护服务程序。

2) 包含详细信息模式

如果想消息更友好一些,可以通过IncludeExceptionDetailInFaults=True来设置返回具体的异常信息,这样就能告诉客户端服务出错了,并指出错误出在哪里。在程序开发阶段或者有些应用场合,客户端是受信任的,为了让客户端能更详尽的了解服务端到底出了什么问题,WCF也支持发送详细的错误消息给客户端,这更有利于应用程序调试。而返回详细异常有两种方法:第一种:通过在服务端的配置文件中设置:,第二种方式为通过在代码中指定:[ServiceBehavior(IncludeExceptionDetailInFaults=true)]

3) 自定义异常消息模式

在WCF中,还支持更详细的异常消息,它通过自定义的异常消息FaultMessage来传达更多的内容。WCF采用通用的Soap Fault来处理异常,并提供了FaultException和FaultException两个类型来描述和操作异常。

WCF中常见的异常类型?

WCF包括三种常见类型的异常:

1) 通讯异常,这通常是因为链路的原因,比如服务没有启动,网络阻塞等。这类异常是CommunicationException或者其派生类

2) 状态异常,这类异常通常是与上文提到的实例模式相关的,当访问了一个已经销毁的服务器对象时便会引发此类型的异常,它们通常是ObjectDisposedException

3) 服务异常,由服务端根据具体的业务逻辑触发,通常是FaultException 值得注意的是当抛出服务异常的时候,不同的实例模式的处理方式有所不同:

PerSession:这种模式下,抛出异常,服务实例将销毁,客户端抛出FaultException,客户端代理对象无法继续使用

PerCall:这种模式下,抛出异常,服务实例也将销毁。客户端代理对象无法继续使用

Single:这种模式下,抛出异常,服务实例会照旧运行。客户端代理无法继续使用。

代码不骗人,用示例来演示效果,加深印象

本文所实现的实例非常简单,目的就是想验证一下各种异常处理方式下的不同表现。

1) 缺省模式

在示例中,我们这样抛出异常

public string GetWelcomeInfo([ParaAtt(CanSetNull=false)] string name)

而此时,我们运行客户端,可以发现如下的运行结果:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Runtime.Serialization;

namespace Jillzhang.Wcf.ExContracts

在定义操作的时候,我们可以指定返回的异常消息的类型,方法如下:

[OperationContract]

[FaultContract(typeof(ExceptionMsg))]

int Devide(int x, int y);

运行实例程序,可以得到如下的结果:

- <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">

- <s:Body>

- <s:Fault>

<faultcode>s:Clientfaultcode>

<faultstring xml:lang="zh-CN">The creator of this fault did not specify a Reason.faultstring>

- <detail>

- <ExceptionMsg xmlns="http://schemas.datacontract.org/2004/07/Jillzhang.Wcf.ExContracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

<ErrorCode>001ErrorCode>

<Message>除数不能为0Message>

ExceptionMsg>

detail>

s:Fault>

s:Body>

s:Envelope>

另外很多人不清楚如何调试跟踪WCF应用程序,特别是想从客户段跟踪到服务中,可以通过以下步骤来完成:





本文参考资料

http://www.rainsts.net/article.asp?id=430

本文示例项目:

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