WCF中的异常处理

异常消息与特定技术有关,.NET异常同样如此,因而WCF并不支持传统的异常处理方式。如果在WCF服务中采用传统的方式处理异常,由于异常消息不能被序列化,因而客户端无法收到服务抛出的异常,例如这样的服务设计:

[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface IDocumentsExplorerService
{
  [OperationContract]
  DocumentList FetchDocuments(string homeDir);
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class DocumentsExplorerService : IDocumentsExplorerService,IDisposable
{
public DocumentList FetchDocuments(string homeDir)
{
  //Some Codes

  if (Directory.Exists(homeDir))
  {
    //Fetch documents according to homedir
  }
  else
  {
    throw new DirectoryNotFoundException(
string.Format("Directory {0} is not found.",homeDir));
  }
}
public void Dispose()
{
  Console.WriteLine("The service had been disposed.");
}
}

则客户端在调用如上的服务操作时,如果采用如下的捕获方式是无法获取该异常的:

catch (DirectoryNotFoundException ex)
{
  //handle the exception;
}

为了弥补这一缺陷,WCF会将无法识别的异常均当作为FaultException异常对象,因此,客户端可以捕获FaultException或者Exception异常:

catch (FaultException ex)
{
  //handle the exception;
}
catch (Exception ex)
{
  //handle the exception;
}

时间: 2024-11-02 00:42:54

WCF中的异常处理的相关文章

使用IErrorHandle对WCF服务器进行异常处理

概述: 在实际的项目开发中,我们常常会处理各种各样的异常,在代码中不断充斥着try{}catch{}finally{}语句块,这些处理有些时候是不可缺少的,因为谁都没有办法保证自己写的代码无异常运行,外部环境造成了异常存在的可能性,但是我常常觉得,捕获异常的语句块经常把原本清晰的业务逻辑弄得七零八落的,当然,本篇的目的不是说异常捕获可完全避免,但到少WCF可以让我们稍微从异常处理中得到一点解脱. 1.首先来看常规的服务实现类在处理异常时的做法,下面是常规的捕获了一个除数为0的异常. 常规异常捕获

在 WCF 中使用高效的 BinaryFormatter 序列化

本文将定义一个 WCF 终结点行为扩展,以在 WCF 中使用更高效的 BinaryFormatter 进行二进制序列化,并实现对是否使用传统二进制序列化功能的可配置. 介绍 实现步骤 使用方法 效果   介绍 在 OEA 框架中,是使用 WCF 作为数据传输框架.但是使用 WCF 内部的二进制序列化,序列化后的数据大小,要比使用传统的 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 类进行序列化后的数据大小要大得多.作

WCF技术剖析之十一:异步操作在WCF中的应用(下篇)

说完了客户端的异步服务调用(参阅WCF技术剖析之十一:异步操作在WCF中的应用(上篇)),我们在来谈谈服务端如何通过异步的方式为服务提供实现.在定义服务契约的时候,相信大家已经注意到了OperationContractAttribute特性具有一个bool类型的AsynPattern.该属性可以将一个服务操作定义成异步实现模式,接下来的内容主要是着眼于介绍异步操作的定义和实现原理. 一.异步操作的定义和实现原理 实现WCF异步服务操作模式在编程上具有一些限制:异步服务操作是通过两个配对的方法实现

WCF技术剖析之十一:异步操作在WCF中的应用(上篇)

按照操作执行所需的资源类型,我们可以将操作分为CPU绑定型(CPU Bound)操作和I/O绑定型(I/O Bound)操作.对于前者,操作的执行主要利用CPU进行密集的计算,而对于后者,大部分的操作处理时间花在I/O操作处理,比如访问数据库.文件系统.网络资源等.对于I/O绑定型操作,我们可以充分利用多线程的机制,让多个操作在自己的线程并发执行,从而提高系统性能和响应能力.服务调用就是典型的I/O绑定型操作,所以多线程在服务调用中具有广泛的应用.在本篇文章中,我们专门来讨论多线程或者是异步操作

WCF中的REST架构二 (支持AJAX的WCF服务

我在昨天的文章WCF中的REST架构一(REST 概述)谈了REST的基本概要,并提出了从HI REST (高REST)到 LO REST (低REST) 的RESTFULness(REST度)的概念.在今天的文章中,我将详细介绍大家可能最为熟悉的REST风格的WCF 服务:支持AJAX的服务.此类服务应属于LO REST的范畴.现在很多人直觉地将"好"等同于"高大全",因而低估了这种LO REST实现的价值.本篇将告诉你这决非事实,支持AJAX的WCF服务是足够强

Symbian学习总结-基础篇-Symbian C++中的异常处理

在现代高级语言中,大多数语言都有对应处理异常的关键字,如:C++中的try/catch,Delphi中的Try/Except/Finally,这些关键字都被编译器直接的支持. 但是,当Symbian OS C++被发明的时候,C++中的关键字try/catch/finally还没有被标准支持.而且照Symbian官方的话来说,C++的异常处理机制太笨重,不够轻量级,他们设计了一套效率更加高,更适合于小型的.内存受限的设备的异常处理机制. 一.回顾历史 在标准C++中,我们使用如下方法来处理异常:

谈谈WCF中的Data Contract(3)

谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持 在本篇文章上一部分Order Processing的例子中,我们看到原本已Collection形式定义的DetailList属性(public IList<TDetail> DetailList),在Data Contract中却以Array的方式体现(public OrderDetail[] DetailList).我们现在就来详细地讨论一下基于C

谈谈WCF中的Data Contract (1):Data Contract Overview

Contract in SO:Contract是对操作和数据的抽象 在我们看来,Service Orientation提供了一种对业务.功能进行分解的方式.针对SO,我们把一个具体的业务流程或者一个复杂的功能分解成一个个独立完成某项任务的子单元,这些子单元通过一个个Service来承载.对于Service本身来讲,他们应该是自治的,独自完成自己的功能.不依赖于其他的Service.但是Service的价值体现在它被潜在的消费者使用的程度.这实际上包含两方面的内容,作为Service本身,它如何将

我的WCF之旅(9):如何在WCF中使用tcpTrace来进行Soap Trace

无论对于Web Service还是WCF,Client和Service之间交互的唯一形式是通过发送和接收Soap Message.在我们对Web Service和WCF进行深入学习的时候,借助一些Soap Trace 工具对Soap Message进行深入剖析是非常有必要的.在这些工具之中,我觉得最好用的就是Microsoft Soap Toolkit中的Soap Trace Utility和tcpTrace.我们今天就来讲讲如何在WCF中使用tcpTrace这个工具. 首先我们来讲讲tcpTr