重温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));
            };
时间: 2024-10-27 10:26:31

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

WCF学习之旅—第三个示例(二十七)

一.前言 通过前面二十几个章节的学习,我们知道了什么是WCF:WCF中的A.B.C:WCF的传输模式:WCF的寄宿方式:WCF的异常处理.本文综合应用以上知识点,一步一步写一个小的WCF应用程序——书籍管理系统(BookMgr). 这个示例就是一个非常简单的书籍管理系统,功能有:查询.修改.新增.删除(不包括安全.优化等相关问题).异常处理.WCF的增删改查和WinForm相差无几.WCF只是把具体“实现”写在“服务端”,而“调用”放在了“客户端”. 二.BookMgr说明 1)Demo的 “服

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

引言 WCF是微软为了实现SOA的框架,它是对微乳之前多种分布式技术的继承和扩展,这些技术包括Enterprise Service..NET Remoting.XML Web Service.MSMQ等.WCF推出的原因在于:微软想将不同的分布式技术整合起来,提供一个统一的编程模型,这样对于开发者来说绝对是好事.在过去的2个月时间内,我陆续写了WCF系列文章,这些文章只是自己这段时间学习WCF内容的一个学习过程和笔记,希望通过这种写博文的方式记录下来和总结.本系列并没有对WCF机制做一个深入解析

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

有次我们有个项目需要Call 一个 Java 的 web service, Soap包中需要一个 Security Head <soapenv:Header> <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <w

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

1.WCF中可靠性会话在绑定层保证消息只会被传输一次,并且保证消息之间的顺序.当使用TCP(Transmission Control Protocol,传输控制协议)通信时,协议本身保证了可靠性.然而,它只在两点之间的网络包这个层面提供了这样的保证.WCF的可靠性会话特性保证了在传输过程中消息不会丢失.重复或错位.这种保证是消息层面的,而且适用于任何数目节点的通信.另外,使用可靠性会话时,WCF会重连掉线的连接,在重连失败时还会释放会话占用的相关资源.可靠性会话还会通过调整消息的发送频率来缓解网

重温WCF之一个服务实现多个契约(二)

public class ServiceImp : IService1,IService2,IService3 { public string SayHelloA() { return "你好,这是第一个服务协定."; } public string SayHelloB() { return "你好,这是第二个服务协定."; } public string SayHelloC() { return "你好,这是第三个服务协定."; } } [Se

跟我一起学WCF(7)——WCF数据契约与序列化详解

一.引言 在前面博文介绍到,WCF的契约包括操作契约.数据契约.消息契约和错误契约,前面一篇博文已经结束了操作契约的介绍,接下来自然就是介绍数据契约了.所以本文要分享的内容就是数据契约. 二.数据契约的介绍 在WCF中,服务契约定义了可供调用的服务操作方法,而数据契约则是定义了服务端和客户端之间传送的自定义类型,在WCF项目中,必不可少地是传递数据,把客户端需要传递的数据传送到服务中,服务接收到数据再对其进行处理.然而在WCF中,传递的类型必须标记为DataContractAttribute属性

跟我一起学WCF(12)——WCF中Rest服务入门

一.引言 要将Rest与.NET Framework 3.0配合使用,还需要构建基础架构的一些部件.在.NET Framework 3.5中,WCF在System.ServiceModel.Web组件中新增了编程模型和这些基础架构部件. 新编程模型有两个主要的新属性:WebGetAttribute和WebInvokeAttribute,还有一个URI模板机制,帮助你声明每种方法响应使用的URI和动词..NET Framework还提供了一个新的绑定(WebHttpBinding)和新的行为(We

Learning WCF Chapter2 WCF Contracts and Serialization

So far I’ve talked about the standards behind it all,but in fact WCF hides most of this from the developer by providing a programming interface for designing service contracts and controlling the message format. Application messaging requirementsare

Dynamic CRM 2013学习笔记(二十二)插件里调用WCF服务

  1. 添加service:     2.调用WCF BasicHttpBinding myBinding = new BasicHttpBinding(); myBinding.Name = "BasicHttpBinding_IAuthService"; myBinding.Security.Mode = BasicHttpSecurityMode.None; myBinding.Security.Transport.ClientCredentialType = HttpClie