WCF的出现,为开发人员带来了不一样的体验。在很多方面都有所改变,为编程者提供了一个非常好的开发环境。比如今天为大家介绍的WCF异常处理,就有许多特殊之处,值得我们去深入的研究。
为普安等地区用户提供了全套网页设计制作服务,及普安网站建设行业解决方案。主营业务为成都做网站、网站建设、普安网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
异常消息与特定技术有关,.NET异常同样如此,因而WCF并不支持传统的异常处理方式。如果在WCF服务中采用传统的方式处理异常,由于异常消息不能被序列化,因而客户端无法收到服务抛出的异常,例如这样的服务设计:
- [ServiceContract(SessionModeSessionMode = SessionMode.Allowed)]
- public interface IDocumentsExplorerService
- {
- [OperationContract]
- DocumentList FetchDocuments(string homeDir);
- }
- [ServiceBehavior(InstanceContextModeInstanceContextMode
=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;
- }
然而,这样捕获的异常,却无法识别DirectoryNotFoundException所传递的错误信息。尤为严重的是这样的异常处理方式还会导致传递消息的通道出现错误,当客户端继续调用该服务代理对象的服务操作时,会获得一个CommunicationObjectFaultedException异常,无法继续使用服务。如果服务被设置为PerSession模式或者Single模式,异常还会导致服务对象被释放,终止服务。
WCF异常处理专门提供了FaultContract特性,它可以被应用到服务操作上,指明操作可能会抛出的异常类型。例如前面的服务契约就可以修改为:
- [ServiceContract(SessionModeSessionMode = SessionMode.Allowed)]
- public interface IDocumentsExplorerService
- {
- [OperationContract]
- [FaultContract(typeof(DirectoryNotFoundException))]
- DocumentList FetchDocuments(string homeDir);
- }
然而,即使通过FaultContract指定了操作要抛出的异常,然而如果服务抛出的异常并非FaultException或者FaultException
- public class DocumentsExplorerService :
IDocumentsExplorerService,IDisposable- {
- public DocumentList FetchDocuments(string homeDir)
- {
- //Some Codes
- if (Directory.Exists(homeDir))
- {
- //Fetch documents according to homedir
- }
- else
- {
- DirectoryNotFoundException exception =
new DirectoryNotFoundException();- throw new FaultException
(exception,- new FaultReason(string.Format("Directory {0}
is not found.", homeDir)));- }
- }
- }
我们可以将服务所要抛出的异常类型作为FaultException
如果只是为了让客户端获得异常消息,即使不施加FaultContract特性,或者抛出非FaultException异常,我们也可以通过ServiceBehavior特性,将服务的IncludeExceptionDetailInFaults设置为true(默认为false),此时,客户端可以捕获抛出的非FaultException异常信息,但该异常仍然会导致通道出现错误。
但是,在发布服务与部署服务时,我们应避免将服务的IncludeExceptionDetailInFaults设置为true。
如果不希望使用FaultContract,同时又要保证服务抛出的WCF异常处理能够被客户端捕获,并且不会导致通道错误,我们还可以通过错误处理扩展的方式实现。此时,我们可以将服务本身作为错误处理对象,令其实现System.ServiceModel.Dispatcher.IErrorHandler接口:
- public class DocumentsExplorerService :
IDocumentsExplorerService,IErrorHandler, IDisposable- {…}
在该接口的ProvideFault()方法中,可以将非FaultContract异常提升为FaultContract
- public void ProvideFault(Exception error,
MessageVersion version, ref Message fault)- {
- if (error is DirectoryNotFoundException)
- {
- FaultException
faultException =
new FaultException( - new DirectoryNotFoundException(), new FaultReason(error.Message));
- MessageFault messageFault = faultException.CreateMessageFault();
- fault = Message.CreateMessage(version,messageFault,
faultException.Action);- }
- }
而在该接口的HandleError()方法中,则可以进行WCF异常处理,例如记录日志。
要使得错误处理扩展生效,还需要向服务通道安装错误处理扩展。方法是让服务类实现System.ServiceModel.Description.IServiceBehavior接口:
- public class DocumentsExplorerService :
IDocumentsExplorerService,IErrorHandler,IServiceBehavior,IDisposable- {…}
然后在ApplyDispatchBehavior()方法中安装错误处理扩展:
- public void ApplyDispatchBehavior(ServiceDescription
serviceDescription, ServiceHostBase serviceHostBase)- {
- foreach (ChannelDispatcher dispatcher in serviceHostBase.
ChannelDispatchers)- {
- dispatcher.ErrorHandlers.Add(this);
- }
- }
通过这样的处理,即使服务抛出的异常为DirectoryNotFoundException异常,并且在服务契约中没有通过FaultContract特性指定该异常,客户端同样能够获得WCF异常处理的错误信息,且该异常不会导致通道发生错误,客户端可以继续调用服务代理对象的操作。
文章题目:WCF异常处理特点体现
文章网址:http://www.csdahua.cn/qtweb/news19/500769.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网