WCF客户端异常处理

异常分类

      WCF的客户端调用由于要使用到非托管的资源,通过网络连接传输数据,有Socket通信开发经验的朋友都知道在网络连接过程中可能出现许多问题,WCF虽然经过了良好的封装,但仍然需要我们在调用时用代码去解决。

      WCF客户端调用的异常分为两种类型:预期异常意外异常,预期异常指的是在通信过程中可能会发生的TimeoutException、CommunicationException 以及CommunicationException 的任何派生类,发生这些异常的原因比较多,可能是请求超时未处理,还有可能是网络问题等等,而这些异常呢,我们是可以通过try catch方式来解决的,通过捕获到CommunicationException 异常来对客户端的调用做出关闭或撤销等其他操作,以免对应用程序的的逻辑处理有影响。意外异常包括灾难性故障(如 OutOfMemoryException)和编程错误(如 ArgumentNullException 或 InvalidOperationException)。通常没有有效的方法来处理意外错误,所以通常不应在调用 WCF 客户端通信方法时捕获这些异常。

那么我们怎么去在调用时处理呢。

实例解析

这里我们建立了一个服务,在客户端引用后我们看一下生成的代理类是继承了clientBase<>的,

image

而ClientBase是继承自IDisposable这个接口的,我们就可以通过Using的方式来解决资源释放问题

image

那么,可以使用using方式来处理WCF的调用吗?

image

上图中在调用WCF后是需要使用结果的,但是我们想一下这个Proxy如果在通信过程中发生异常了,还能继续foreach的循环么?显然是不行的,因为在using的关闭大括号处已经抛出异常了,因此WCF并不推荐这样的处理,我们可以使用try catch方式来捕获这些预期的异常做出处理:

image

上面只是对异常做了简单的处理,并不能确定是什么异常,那么我们就可以利用WCF的预期异常来确定异常细节进而做出更细节化得处理

image

那么这样的处理后,当出现异常后我们可以对客户端进行相应异常的提示,在开发中也可以为调试提供更准确的信息。

另,在silverlight调用WCF时发现代理类并没有继承IDisposable,猜想是自己进行资源释放了吧,OOB后提升了权限,不知道跟网络连接释放有没有关系,有知道的朋友不妨告诉一下。多谢。

posted @ 2011-04-29 08:35 翁玉礼 阅读(...) 评论(...) 编辑 收藏