FaultException异常,该异常对象通过以字符串形式体现的自定义错误信息创建。 虽然在很多情况下,在服务端指定服务操作的过程中直接抛出含有自定义错误信息的FaultException异常,就能过客户端感知到遇到的具体错误并进行必要的排错和纠错。 异常,而我们试图捕获的异常类型为FaultException<CalculationError>。 也即是说,同样对于我们的计算服务的例子,如果服务端试图通过抛出一个FaultException<string>来提供错误(如下面的代码所示),客户端最后捕获到的仅仅是一个FaultException异常 ,而非FaultException<string>异常。
把原先的throw FaultException改成泛型的FaultException<T> public class CalculatorService : ICalculatorService numerator / denominator; } catch(DivideByZeroException ex) { throw new FaultException (ex.Message, new FaultCode("Unknow Code")); } } } 如果是除零异常,则抛出FaultException<DivideByZeroFault >的,否者抛出普通的FaultException。 这集好像挺简单的,讲了如何使用FaultException<T>来添加自定义的error message。 Thank You !
前面几集讲了服务端遇到普通的 .net exception时候,要转换城Soap Fault,用fault Exception 或 FaultException<T>来处理。 ) return; var faultException = new FaultException("A general service error occured!") ; var msgFault = faultException.CreateMessageFault(); fault = Message.CreateMessage ProvideFault: 这个用来构造一个我们需要的FaultException,来避免channel的失效。大致意思是如果error已经是FaultException了,就直接return。 当Exception 发生时,先进入ProvideFault方法,然后直接return 出这个FaultException给客户端,避免客户端的等待。同时,异步调用HandleError方法。
在[上篇]中,我们分别站在消息交换和编程的角度介绍了SOAP Fault和FaultException异常。 一、FaultException异常和Fault消息之间的纽带:MessageFault 对于WCF的异常处理框架,其本身并不直接进行FaultException异常和Fault消息之间的转换,而是通过另外一个作为中介的对象来完成的 和FaultException之间的转换关系。 WCF将实现MessageFault和FaultException之间的转化的API定义在FaultException类中。 ,对于FaultException异常对象的序列化自然也不例外。
服务端只有抛出FaultException异常才能被正常地序列化成Fault消息,并实现向客户端传播。 WCF内部是如何处理抛出的非FaultException异常的呢? 实际上,WCF对非FaultException异常的处理并不复杂,我们现在就来简单介绍一下相关的流程:在执行服务操作过程中,如果抛出一个非FaultException异常,WCF会先判断IncludeExceptionDetailInFaults 所以,无论服务端抛出怎样的异常,客户端捕获的总是具有相同信息的FaultException异常。 注:客户端的错误信息总是这么一段文字:“由于内部错误,服务器无法处理该请求。 而客户端捕获的总是一个泛型的FaultException<ExceptionDetail>异常。 一、ExceptionDetail对象为何能被反序列化?
3: { 4: //其他成员 5: public FaultException(); 6: public FaultException(FaultReason reason); 7: public FaultException(string reason); 8: public FaultException(FaultReason FaultException的异常类型定义的:FaultException<TDetail>。 2: public class FaultException<TDetail> : FaultException 3: { 4: //其他成员 5: public FaultException FaultException(TDetail detail, string reason); 8: protected FaultException(SerializationInfo
WCF客户端和服务端的框架体系相互协作,使得开发人员可以按照我们熟悉的方式进行异常的处理:在服务操作执行过程中抛出异常(FaultException),在调用服务时捕获异常,完全感觉不到“分布式”的存在 我们可以这样来简单地描述WCF异常处理框架的功能实现:WCF服务端将抛出的FaultException异常进行序列化,并根绝消息的SOAP规范(SOAP 1.1或SOAP 1.2)和WS-Addressing 反序列化的结果即实现对FaultException的重建,WCF最终将重建的FaultException异常抛出,对于最终的开发者而言,感觉就像服务端抛出的FaultException直接被客户端捕获了一样 在上面的内容中我们说过:WCF并不直接进行FaultException和Fault消息之间的转换,而是借助于MessageFault这一中间对象。 在WCF服务端框架内,在实现FaultException异常对象相Fault消息转换的过程中,除了提供与FaultException对等的MessageFault之外,还需要提供FaultException
FaultException<TDetail>继承自FaultException,这两种典型的异常类型在WCF异常处理中具有重要的地位,在本章后续章节中还会重点讲述,在这里先做一点简单的介绍。 对于所有从服务端抛出的异常,只有FaultException和直接或间接继承自FaultException的异常才能被序列化,并最终通过消息返回给服务的调用端。 FaultException可以通过文本的形式保存相应的错误信息。 FaultException<TDetail>在FaultException现有的基础上,增加了一个额外的特性:将错误信息通过一个具体的对象表示,其类型便是范型类型TDetail,该对象可以通过属性Detail 1: [Serializable] 2: public class FaultException<TDetail> : FaultException 3: { 4:
WCF的异常信息默认是以FaultException的形式返回到客户端,FaultException的关键属性Reason是对客户端反馈的最重要信息之一。 以上客户端代码调用之后,默认的FaultException返回的Message信息如下: 由于内部错误,服务器无法处理该请求。 </behavior> </serviceBehaviors> 通过以上设置之后,客户端输出的内容为“尝试除以零”,这个提示信息跟原始的异常信息是一致,即返回的FaultException 最直接的形式莫过于在服务端就把异常给捕获了,并重新throw一个FaultException 服务端的代码改进如下,经过以下改进,那么客户端得到的信息仅仅是"操作失败",同时服务端也记录了异常信息 Exception ex) { Console.WriteLine(ex.Message); throw new FaultException
numerator, int denominator) { if(denominator == 0) { throw new FaultException } return numerator / denominator; } } 手动判断除数是否为0,如果为0, throw一个 FaultException FaultException用来表示一个基于xml的和平台无关的SOAP,这样就确保了客户端的平台无关性。 ? 下面来试验一下效果: 1. host起这个service ? 2. 现在我们已经改成了FaultException,再试验了一下。 ? it works。 如果在实际的coding中,应该是在服务端的代码上加个大的try-catch块,然后在catch块中throw出一个FaultException。 Thank you.
如果有異常就返回下面定義的數據契約的結構數據 2.使用系统的异常类型 [FaultContract(typeof(DivideByZeroException))] 在契约实现类中将异常抛出 throw new FaultException try { return this.Channel.Return(); } catch (FaultException { throw new Exception(exception.Detail.Message); } catch(FaultException exception) { throw new Exception(exception.Detail.Message); } FaultException FaultException<DivideByZeroException> exception:这个抓取的是系统异常类型 注意这里获取异常的信息的方法是exception.Detail.Message,
如果category参数提供的字符串为Null或者是空字符串,抛出一个FaultException异常并提示“Invalid Category”,这样客户端在输入不合法参数的情况下可以得到错误消息。 (string categoty) { if (string.IsNullOrEmpty(categoty)) { throw new FaultException 这貌似和我们预期的效果不一样,我们希望的是客户端抛出一个FaultException,并提示“Invalid category”。 (string categoty) { if (string.IsNullOrEmpty(categoty)) { throw new FaultException
我们知道,客户端进行 服务调用抛出的异常类型总是FaultException(包括FaultException<TDetail>)。 采用这样的方式来直接处理调用WCF服务抛出的异常,显然具有很大的局限:如果服务不错任何处理,客户端捕获的永远是FaultException(不包括FaultException<TDetail>)异常,如果采用 当然,在服务端的操作实现中你可以根据具体的场景抛出FaultException<TDetail>异常,并通过不同类型的错误明细(TDetail)封装具体的错误信息,那么客户端就可以针对具体的FaultException 在ProvideFault方法中,先判断抛出的异常是否是FaultException,如果是则不作处理(在这种情况下,一般是服务提供者人为抛出的,并不希望再作进一步的处理)。 <ServiceExceptionDetail> exception = (FaultException<ServiceExceptionDetail>)FaultException.CreateFault
我们发现Client catch住的不是我们Service端真正抛出的DivideByZeroException Exception,而是一个比较General的FaultException。 可以看到我们我们Catch的是一个FaultException< ExceptionDetail>Type的Exception,不是原来的FaultException。 public class CalculatorService:ICalculator { ICalculator Members } } 在被除数为0的时候,抛出FaultException = {2} when x = {0} and y = {1}", 2, 0, calculator.Divide(2, 0)); } catch (FaultException
无论是显示打开还是通过调用操作自动打开、使用客户端或者通过对象调用操作,或者关闭基础客户端通道,都会在客户端应用程序中出现异常,WCF是基于网络的通讯服务,错误异常也是要基于消息传递的,在WCF中提供了一个错误消息处理的类FaultException return a / b; } catch (DivideByZeroException) { throw new FaultException ("除数不能为0");//FaultException需要引用System.ServiceModel命名空间 } } } } UserInfo.cs using
IOrderRessponse { [OperationContract(IsOneWay =true)] void SubmitOrderResponse(Guid orderNo,FaultException Console.WriteLine("Begin to process the order of the order No.: {0}", order.OrderNo); FaultException null; if (order.OrderDate < DateTime.Today) { exception = new FaultException ; } } #endregion } } 在这里我们模拟了这样的场景:先通过Order Date判断Order是否过期,如果过期创建一个FaultException { #region IOrderRessponse Members public void SubmitOrderResponse(Guid orderNo, FaultException
错误消息与FaultException异常 1.2.1. 从SOAP Fault说起 1.2.2. 唯一可被传播的异常:FaultException 1.2.3. FaultException异常和错误消息之间的转换 1.3. WCF异常处理体系剖析 1.3.1. FaultFormatter 1.3.2.
."); 14: throw new FaultException<ServiceExceptionInfo>(new ServiceExceptionInfo(ex)); 15 AssemblyQualifiedName; 29: this.Message = ex.Message; 30: } 31: } 如下面的代码片段所示,由于GetData操作抛出的FaultException
string.Format("调用WCF接口 '{0}' 出错", ex.TargetSite.Name) ",详情:\r\n" ex.Message; var newEx = new FaultException
在WCF中,所有的异常信息都是通过FaultException类来传播的,可以通过其泛型参数<TDetail>来传播自定义的信息。 WCF并不直接进行FaultException异常和错误消息之间的交换,其通过一个System.ServiceModel.Channels.MessageFault对象来完成,此外消息的格式化通过FaultFormatter