1. 1.(服务端)抛出和(客户端)捕获SOAP Fault
  2. 当我们需要客户端获取到WCF服务端的抛出的异常的时候,使用FaultException
  3. WCF类库在System.ServiceModel命名空间下提供了FaultException类。如果WCF服务抛出FaultException对象,WCF运行时将生成SOAP fault消息并回传给客户端程序。
  4. 服务端抛出异常
  5. catch (Exception ex)
  6. {
  7. if (ex.InnerException is System.Data.SqlClient.SqlException)
  8. throw new FaultException(string.Format("Exception accessing database:{0}",
  9. ex.InnerException.Message), new FaultCode("Connect to database"));
  10. else
  11. throw new FaultException(string.Format("Exception reading from numbers: {0}",
  12. ex.Message), new FaultCode("Iterate through products"));
  13. }
  14.  
  15. 客户端捕获异常
  16. try
  17. {
  18. ...
  19. }
  20. catch (FaultException ex)
  21. {
  22. Console.WriteLine("{0}: {1}", ex.Code.Name, ex.Reason)
  23. }
  24.  
  25. 2.使用强类型SOAP faults
  26. 调用WCF服务时不知道会抛出什么样的异常,使用一个类来约定客户端和服务器端来约定服务器端抛出来的异常
  27. 服务器端代码:
  28. [DataContract]
  29. public class SystemFault
  30. {
  31. [DataMember]
  32. public string SystemOperation { get; set; }
  33.  
  34. [DataMember]
  35. public string SystemReason { get; set; }
  36.  
  37. [DataMember]
  38. public string SystemMessage { get; set; }
  39. }
  40.  
  41. [FaultContract(typeof(SystemFault))]
  42. [OperationContract]
  43. string GetData(int value);
  44.  
  45. public string GetData(int value)
  46. {
  47. SystemFault fault = new SystemFault
  48. {
  49. SystemOperation = "哪个操作",
  50. SystemReason = "错误原因",
  51. SystemMessage ="错误消息"
  52. };
  53. throw new FaultException(fault);
  54. return string.Format("You entered: {0}", value);
  55. }
  56.  
  57. 客户端代码:
  58. catch (FaultException sf)
  59. {
  60. Console.WriteLine("SystemFault {0}: {1}\n{2}",
  61. sf.Detail.SystemOperation,
  62. sf.Detail.SystemMessage,
  63. sf.Detail.SystemReason);
  64. }
  65.  
  66. 3.报告意外预料之外的异常
  67. 在你开发WCF服务时,为了在客户端程序调试,将会把服务端发生的所有异常(包括预料之内的和预料之外的)转换成SOAP faults消息传送至客户端是非常有用的。
  68. 调试的时候将WCF服务的配置文件 设置为true,等正式上线的时候设置为false
  69.  
  70. 4.WCF服务宿主处理异常
  71. (1)针对错误处理,ServiceHost则提供了Faulted事件,调用该事件后,ServiceHost对象进入Faulted状态。当发生错误的时候,你通过订阅该事件,然后使用其提供的方法确定发生错误的原因,最后抛弃现有的服务并重启一个新的服务。
  72. 示例代码:
  73. try
  74. {
  75. ServiceHost productsServiceHost;
  76. productsServiceHost = new ServiceHost(typeof(Products.ProductsService));
  77. productsServiceHost.Open();
  78.  
  79. // subscribe the faulted event
  80. productsServiceHost.Faulted += (eventSender, eventArgs) =>
  81. {
  82. productsServiceHost.Abort();
  83.  
  84. productsServiceHost = new ServiceHost(typeof(Products.ProductsService));
  85. productsServiceHost.Open();
  86. };
  87. }
  88. catch (Exception ex)
  89. {
  90. // handleException(ex);
  91. }
  92.  
  93. (2)在宿主程序中处理来自客户端的预料之外的消息
  94. 客户端发送消息
  95. Message request = Message.CreateMessage(MessageVersion.Soap11, "http://tempuri.org/IProductsService/ListProducts");
  96. 服务端处理
  97. productsServiceHost.UnknownMessageReceived +=(eventSendaer, eventArgs)
  98. {
  99. MessageBox.Show(string.Format("A client attempted to send the message {0}",
  100. eventArgs.Message.Headers.Action));
  101. };

重温WCF之WCF抛出异常的处理SOAP Fault(十二)的更多相关文章

  1. WCF服务创建与抛出强类型SOAP Fault

    原创地址:http://www.cnblogs.com/jfzhu/p/4060666.html 转载请注明出处 前面的文章<WCF服务的异常消息>中介绍过,如果WCF Service发生 ...

  2. WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇]

    原文:WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇] 在[上篇]中,我们分别站在消息交换和编程的角度介绍了SOAP Fault和FaultException异常.在服务执行过 ...

  3. 跟我一起学WCF(13)——WCF系列总结

    引言 WCF是微软为了实现SOA的框架,它是对微乳之前多种分布式技术的继承和扩展,这些技术包括Enterprise Service..NET Remoting.XML Web Service.MSMQ ...

  4. Learing WCF Chapter1 WCF Services

    WCF ServicesWCF services are the new distributed boundary in an enterprise application—with an empha ...

  5. WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)

    原文:WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济 ...

  6. 扩展Wcf call security service, 手动添加 Soap Security Head.

    有次我们有个项目需要Call 一个 Java 的 web service, Soap包中需要一个 Security Head <soapenv:Header> <wsse:Secur ...

  7. 重温WCF之WCF传输安全(十三)(4)基于SSL的WCF对客户端采用证书验证(转)

    转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/20/2695397.html 前一篇我们演示了基于SSL的WCF 对客户端进行用户名和密码方式的 ...

  8. 重温WCF之WCF中可靠性会话(十四)

    1.WCF中可靠性会话在绑定层保证消息只会被传输一次,并且保证消息之间的顺序.当使用TCP(Transmission Control Protocol,传输控制协议)通信时,协议本身保证了可靠性.然而 ...

  9. 重温WCF之WCF传输安全(十三)(3)基于SSL的WCF对客户端验证(转)

    转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/18/2690719.html 上文我们演示了,客户端对服务器端身份的验证,这一篇来简单演示一下对 ...

随机推荐

  1. 下载老版本的Xcode

    1.苹果开发者中心,找到Xcode 2.点击下载 3,找到Support 4.找到所需的版本,点击"+"下载 5.安装Xcode,愉快的开发.

  2. K-V-O 键值观察机制

    在两个不同的控制器之间传值是iOS开发中常有的情况,应对这种情况呢,有多种的应对办法.kvc就是其中的一种,所以,我们就在此解释之.   key value observing  键值观察,给人一种高 ...

  3. eclipse添加velocity项目

    1.首先添加jar包,记得包含以下的主要两个类别 2.新建一个servlet类(继承自VelocityViewServlet) package com.servlet; import java.uti ...

  4. 我的Vim配置(自动补全/树形文件浏览)

    配置文件的下载路径在这里  http://files.cnblogs.com/files/oloroso/vim.configure.xz.gz 这实际上是一个 xz 格式的文件,添加的 gz 文件后 ...

  5. 前端之css、JavaScript和DOM

    css position 一般组合 relative+absolute,以relative为父元素,absolute依照relative进行定位. opcity: 0.5 透明度 z-index: 层 ...

  6. JDBC的应用

    JDBC的开发步骤: 1.  引入JDBC驱动架包 2.  程序中引入JDBC驱动类     3.  创建java与数据库的连接 4.  跟数据库交互:发送sql语句,接收数据库对sql语句的执行结果 ...

  7. ZJOIDay2T1 BB题解

    讲道理我是调不出来了... 考虑对序列按下标维护每个节点最后的树. 那么 改操作点 - 把一段连续的节点改父亲 加点/删点(注意拆成两个操作了) 插儿子 那么用seg维护一下下标, 用ETT维护Dep ...

  8. neutron 网络配置flat模式

    使用flat模式,直接使用物理网络的子网,配置如下:

  9. vs2013 内置IIS Express相关问题

    问题描述,以前做的程序迁移到vs2013后出现500.22问题. HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设 ...

  10. android studio插件提升工作效率

    SonarLint 代码质量管理插件 ButterKnife Zelezny ButterKnife 生成器,快速根据布局文件生成属性对象. SelectorChapek 设计师给我们提供好了各种资源 ...