WCF调用服务异常基本解决方案介绍

在应用WCF工具进行实际开发的时候,通常都会遇到一些异常的发生。那么如何才能正确有效的处理这些异常的产生呢?在这里我们先来一起了解一下WCF调用服务异常的相关解决方法,以帮助大家解决问题。#t#

“专业、务实、高效、创新、把客户的事当成自己的事”是我们每一个人一直以来坚持追求的企业文化。 成都创新互联公司是您可以信赖的网站建设服务商、专业的互联网服务提供商! 专注于成都网站制作、成都网站设计、软件开发、设计服务业务。我们始终坚持以客户需求为导向,结合用户体验与视觉传达,提供有针对性的项目解决方案,提供专业性的建议,创新互联建站将不断地超越自我,追逐市场,引领市场!

WCF调用服务异常主要包括以下三种类型:

1. 通讯异常。诸如网络错误,地址错误,服务器没有启动等等。这类异常多是 CommunicationException (或其具体继承类型)。

2. 状态异常。比如访问了已经关闭的代理对象,契约错误,以及安全设置错误等。常见的有 ObjectDisposedException。

3. 服务异常。由服务器触发,多是 FaultException。

针对WCF调用服务异常,不同的实例管理方式会有不同的策略。

1. Pre-Call: 服务实例被释放,客户端抛出 FaultException,客户端代理对象无法继续使用。

2. Pre-Session: 服务实例被释放,会话终止。客户端抛出 FaultException,客户端代理对象无法继续使用。

3. Singleton: 服务实例依旧运行,会话终止。客户端抛出 FaultException,客户端代理对象无法继续使用。

基于平台中立和技术整合的需要,WCF 以标准 Soap Faults 方式传递异常信息。WCF 提供了 FaultException 和 FaultException 两个类型来操控 Soap Faults。通过 FaultException 我们可以向客户端传递一个错误信息(FaultReason)以及一个附加的详细信息(Detail)。理论上,这个附加信息是任何可以序列化的对象。

 
 
 
  1. throw new FaultException(123, "abc");
  2. throw new FaultException(new Exception("abc"));

如果想传递一个附带元数据的自定义详细信息,可以使用FaultContract。

 
 
 
  1. [DataContract]
  2. public class ExceptionData
  3. {
  4. [DataMember]
  5. public string Message;
  6. }
  7. [ServiceContract]
  8. public interface IService
  9. {
  10. [OperationContract]
  11. [FaultContract(typeof(ExceptionData))]
  12. void Test();
  13. }
  14. public class Service : IService, IDisposable
  15. {
  16. public void Test()
  17. {
  18. ExceptionData d = new ExceptionData();
  19. d.Message = "xxxxxx";
  20. throw new FaultException(d, "abc");
  21. }
  22. public void Dispose()
  23. {
  24. Console.WriteLine("Dispose...");
  25. }
  26. }

当然,我们也可以直接抛出一个被称之为 "Unknown Faults" 的 FaultException 异常实例。还有另外一种情况,你已经写好了代码,有很多……很多……的代码,要是一个个修改会非常……非常……麻烦,那么怎么在不做大的代码修改情况下传递详细异常信息给客户端呢?

WCF调用服务异常方法1: ServiceBehavior(IncludeExceptionDetailInFaults=true)]

 
 
 
  1. [ServiceBehavior(IncludeExceptionDetailInFaults=true)]
  2. public class Service : IService, IDisposable
  3. {
  4. public void Test()
  5. {
  6. throw new Exception("abc");
  7. }
  8. public void Dispose()
  9. {
  10. Console.WriteLine("Dispose...");
  11. }
  12. }

方法2: ServiceDebugBehavior

这个WCF调用服务异常的处理方法比方法1要更方便一些,我们除了可以写代码外,还可以用配置文件。

 
 
 
  1. ServiceHost host = new ServiceHost(typeof(Service), 
    new Uri("http://localhost:8080/Service"));
  2. host.AddServiceEndpoint(typeof(IService), 
    new BasicHttpBinding(), "");
  3. ServiceDebugBehavior debug = host.Description.Behaviors.
    Find();
  4. debug.IncludeExceptionDetailInFaults = true;
  5. host.Open();

看看这两种方法抛出的异常是什么样的。

未处理 System.ServiceModel.FaultException`1

Message="abc"

Source="mscorlib"

StackTrace:

Server stack trace:

在 ConsoleApplication1.localhost.IService.Test()

在 ConsoleApplication1.localhost.ServiceClient.Test() 位置 D:\...\localhost.cs:行号 60

在 ConsoleApplication1.Program.Main(String[] args) 位置 D:\...\Program.cs:行号 62

不错,除了 Error Message,还有详细的 stack trace,方便调试。也正因为这样,此种方法也不适合在正式项目中使用,作为系统架构设计的一部分,我们应该事先设计好异常处理。

如果服务方法是 IsOneWay=true,因不接收返回消息,客户端也就不会触发异常了。而 Callback 无非是服务器和客户端掉换个身份而已,道理相同。

 
 
 
  1. public interface ICallback
  2. {
  3. [OperationContract]
  4. void DoCallback();
  5. }
  6. [ServiceContract(CallbackContract=typeof(ICallback))]
  7. public interface IService
  8. {
  9. [OperationContract]
  10. void Test();
  11. }
  12. [ServiceBehavior(ConcurrencyModeConcurrencyMode=
    ConcurrencyMode.Reentrant)]
  13. public class Service : IService, IDisposable
  14. {
  15. public void Test()
  16. {
  17. try
  18. {
  19. OperationContext.Current.GetCallbackChannel().
    DoCallback();
  20. }
  21. catch (FaultException e)
  22. {
  23. Console.WriteLine(e);
  24. }
  25. }
  26. public void Dispose()
  27. {
  28. Console.WriteLine("Dispose...");
  29. }
  30. }

以上就是我们为大家介绍的WCF调用服务异常的相关解决方法。

当前名称:WCF调用服务异常基本解决方案介绍
标题链接:http://www.mswzjz.cn/qtweb/news29/252129.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能