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(十二)的更多相关文章

  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. MySQL 同主机不同数据库之间的复制

    MySQL同主机不同数据库的复制命令:注意运行在Terminal中,不运行在MySQL命令行中. mysqldump Portal_DEV -u root -ppassword1 --add-drop ...

  2. hiho #1151 : 骨牌覆盖问题·二 (递推,数论)

    #1151 : 骨牌覆盖问题·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3xN的骨牌问题? ...

  3. JavaScript深入浅出2-表达式和运算符

    慕课网教程视频地址:Javascript深入浅出 表达式是指能计算出值的任何可用程序单元 原始表达式:常量.直接量 3.14,“test” 关键字 null,this 变量 i,k,j 表达式含:原始 ...

  4. python 随笔(property & __class__)

    1. 属性装饰器: property @property def errors(self): """ Returns a list of form.errors for ...

  5. 使用SharePoint 2010 母版页

    SharePoint 2010母版页所用的还是ASP.NET 2.0中的技术.通过该功能,实现了页面框架布局与实际内容的分离.虽然在本质上自定义母版页的过程和以前版本的SharePoint大致相同,但 ...

  6. memcpy vs memmove

    [本文连接] http://www.cnblogs.com/hellogiser/p/memcpy_vs_memmove.html [分析] memcpy与memmove的目的都是将N个字节的源内存地 ...

  7. ubuntu14.04和win7共享文件夹

    环境:vmware12 问题:安装了vmware-tools,但是在/mnt/hgfs下面看不到共享的文件夹. 按照网上的一些经验和教程使用如下命令: mount -t vmhgfs .host:/ ...

  8. mysql备份与还原

    一.直接拷贝数据库文件 直接拷贝数据库文件一般是使用文件系统备份工具cp,适合小型数据库,是最可靠的. 当你拷贝数据库文件时,必须保证表没有正在使用.如果服务器在你拷贝一个表的时候改变这个表,拷贝就失 ...

  9. MongoDB 索引相关知识

    背景: MongoDB和MySQL一样,都会产生慢查询,所以都需要对其进行优化:包括创建索引.重构查询等.现在就说明在MongoDB下的索引相关知识点,可以通过这篇文章MongoDB 查询优化分析了解 ...

  10. ZOJ 3812 We Need Medicine(dp、背包、状态压缩、路径记录)

    参考:http://blog.csdn.net/qian99/article/details/39138329 参考的链接里说明得很好,注释也很好...thanks for sharing 朴素的想法 ...