重温WCF之WCF抛出异常的处理SOAP Fault(十二)
- 1.(服务端)抛出和(客户端)捕获SOAP Fault
- 当我们需要客户端获取到WCF服务端的抛出的异常的时候,使用FaultException类
- WCF类库在System.ServiceModel命名空间下提供了FaultException类。如果WCF服务抛出FaultException对象,WCF运行时将生成SOAP fault消息并回传给客户端程序。
- 服务端抛出异常
- catch (Exception ex)
- {
- if (ex.InnerException is System.Data.SqlClient.SqlException)
- throw new FaultException(string.Format("Exception accessing database:{0}",
- ex.InnerException.Message), new FaultCode("Connect to database"));
- else
- throw new FaultException(string.Format("Exception reading from numbers: {0}",
- ex.Message), new FaultCode("Iterate through products"));
- }
- 客户端捕获异常
- try
- {
- ...
- }
- catch (FaultException ex)
- {
- Console.WriteLine("{0}: {1}", ex.Code.Name, ex.Reason)
- }
- 2.使用强类型SOAP faults
- 调用WCF服务时不知道会抛出什么样的异常,使用一个类来约定客户端和服务器端来约定服务器端抛出来的异常
- 服务器端代码:
- [DataContract]
- public class SystemFault
- {
- [DataMember]
- public string SystemOperation { get; set; }
- [DataMember]
- public string SystemReason { get; set; }
- [DataMember]
- public string SystemMessage { get; set; }
- }
- [FaultContract(typeof(SystemFault))]
- [OperationContract]
- string GetData(int value);
- public string GetData(int value)
- {
- SystemFault fault = new SystemFault
- {
- SystemOperation = "哪个操作",
- SystemReason = "错误原因",
- SystemMessage ="错误消息"
- };
- throw new FaultException(fault);
- return string.Format("You entered: {0}", value);
- }
- 客户端代码:
- catch (FaultException sf)
- {
- Console.WriteLine("SystemFault {0}: {1}\n{2}",
- sf.Detail.SystemOperation,
- sf.Detail.SystemMessage,
- sf.Detail.SystemReason);
- }
- 3.报告意外预料之外的异常
- 在你开发WCF服务时,为了在客户端程序调试,将会把服务端发生的所有异常(包括预料之内的和预料之外的)转换成SOAP faults消息传送至客户端是非常有用的。
- 调试的时候将WCF服务的配置文件 设置为true,等正式上线的时候设置为false
- 4.在WCF服务宿主处理异常
- (1)针对错误处理,ServiceHost则提供了Faulted事件,调用该事件后,ServiceHost对象进入Faulted状态。当发生错误的时候,你通过订阅该事件,然后使用其提供的方法确定发生错误的原因,最后抛弃现有的服务并重启一个新的服务。
- 示例代码:
- try
- {
- ServiceHost productsServiceHost;
- productsServiceHost = new ServiceHost(typeof(Products.ProductsService));
- productsServiceHost.Open();
- // subscribe the faulted event
- productsServiceHost.Faulted += (eventSender, eventArgs) =>
- {
- productsServiceHost.Abort();
- productsServiceHost = new ServiceHost(typeof(Products.ProductsService));
- productsServiceHost.Open();
- };
- }
- catch (Exception ex)
- {
- // handleException(ex);
- }
- (2)在宿主程序中处理来自客户端的预料之外的消息
- 客户端发送消息
- Message request = Message.CreateMessage(MessageVersion.Soap11, "http://tempuri.org/IProductsService/ListProducts");
- 服务端处理
- productsServiceHost.UnknownMessageReceived +=(eventSendaer, eventArgs)
- {
- MessageBox.Show(string.Format("A client attempted to send the message {0}",
- eventArgs.Message.Headers.Action));
- };
重温WCF之WCF抛出异常的处理SOAP Fault(十二)的更多相关文章
- WCF服务创建与抛出强类型SOAP Fault
原创地址:http://www.cnblogs.com/jfzhu/p/4060666.html 转载请注明出处 前面的文章<WCF服务的异常消息>中介绍过,如果WCF Service发生 ...
- WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇]
原文:WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇] 在[上篇]中,我们分别站在消息交换和编程的角度介绍了SOAP Fault和FaultException异常.在服务执行过 ...
- 跟我一起学WCF(13)——WCF系列总结
引言 WCF是微软为了实现SOA的框架,它是对微乳之前多种分布式技术的继承和扩展,这些技术包括Enterprise Service..NET Remoting.XML Web Service.MSMQ ...
- Learing WCF Chapter1 WCF Services
WCF ServicesWCF services are the new distributed boundary in an enterprise application—with an empha ...
- WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)
原文:WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济 ...
- 扩展Wcf call security service, 手动添加 Soap Security Head.
有次我们有个项目需要Call 一个 Java 的 web service, Soap包中需要一个 Security Head <soapenv:Header> <wsse:Secur ...
- 重温WCF之WCF传输安全(十三)(4)基于SSL的WCF对客户端采用证书验证(转)
转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/20/2695397.html 前一篇我们演示了基于SSL的WCF 对客户端进行用户名和密码方式的 ...
- 重温WCF之WCF中可靠性会话(十四)
1.WCF中可靠性会话在绑定层保证消息只会被传输一次,并且保证消息之间的顺序.当使用TCP(Transmission Control Protocol,传输控制协议)通信时,协议本身保证了可靠性.然而 ...
- 重温WCF之WCF传输安全(十三)(3)基于SSL的WCF对客户端验证(转)
转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/18/2690719.html 上文我们演示了,客户端对服务器端身份的验证,这一篇来简单演示一下对 ...
随机推荐
- 下载老版本的Xcode
1.苹果开发者中心,找到Xcode 2.点击下载 3,找到Support 4.找到所需的版本,点击"+"下载 5.安装Xcode,愉快的开发.
- K-V-O 键值观察机制
在两个不同的控制器之间传值是iOS开发中常有的情况,应对这种情况呢,有多种的应对办法.kvc就是其中的一种,所以,我们就在此解释之. key value observing 键值观察,给人一种高 ...
- eclipse添加velocity项目
1.首先添加jar包,记得包含以下的主要两个类别 2.新建一个servlet类(继承自VelocityViewServlet) package com.servlet; import java.uti ...
- 我的Vim配置(自动补全/树形文件浏览)
配置文件的下载路径在这里 http://files.cnblogs.com/files/oloroso/vim.configure.xz.gz 这实际上是一个 xz 格式的文件,添加的 gz 文件后 ...
- 前端之css、JavaScript和DOM
css position 一般组合 relative+absolute,以relative为父元素,absolute依照relative进行定位. opcity: 0.5 透明度 z-index: 层 ...
- JDBC的应用
JDBC的开发步骤: 1. 引入JDBC驱动架包 2. 程序中引入JDBC驱动类 3. 创建java与数据库的连接 4. 跟数据库交互:发送sql语句,接收数据库对sql语句的执行结果 ...
- ZJOIDay2T1 BB题解
讲道理我是调不出来了... 考虑对序列按下标维护每个节点最后的树. 那么 改操作点 - 把一段连续的节点改父亲 加点/删点(注意拆成两个操作了) 插儿子 那么用seg维护一下下标, 用ETT维护Dep ...
- neutron 网络配置flat模式
使用flat模式,直接使用物理网络的子网,配置如下:
- vs2013 内置IIS Express相关问题
问题描述,以前做的程序迁移到vs2013后出现500.22问题. HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设 ...
- android studio插件提升工作效率
SonarLint 代码质量管理插件 ButterKnife Zelezny ButterKnife 生成器,快速根据布局文件生成属性对象. SelectorChapek 设计师给我们提供好了各种资源 ...