具体来说,这是一个关于如何自动为服务接口(契约)的每个操作添加FaultContract与WCF服务元数据发布的问题。接下来通过一个简单的实例来说明这个因为少写了一行代码引发的血案。 一、手工添加FaultContract WCF采用基于消息的通信方式,Endpoint的ABC三要素之一的契约(Contract)的本质就是定义消息的结构。 ServiceContract] 2: public interface IMyService 3: { 4: [OperationContract] 5: [FaultContract 如下所示的MyServiceHost模拟了FaultContract自动化注册的逻辑。
5: public interface ICalculator 6: { 7: [OperationContract] 8: [FaultContract (typeof(CalculationError))] 9: [FaultContract(typeof(CalculationError))] 10: int 5: public interface ICalculator 6: { 7: [OperationContract] 8: [FaultContract (typeof(CalculationError), Name = "CalculationError")] 9: [FaultContract(typeof(CalculationError (typeof(CalculationError))] 9: [FaultContract(typeof(CalculationFault))] 10: int
DataContractFormat]//定義序列化的方式 [OperationContract] string GetName(string pInc); [FaultContract (typeof(ErroInfo.Erro))]//如果有異常就返回下面定義的數據契約的結構數據 [FaultContract(typeof(DivideByZeroException) [OperationContract] DataCollection Return(); } 在方法中定义属性,这里有两种实现 1.使用自定义的错误类型 [FaultContract (typeof(ErroInfo.Erro))]//如果有異常就返回下面定義的數據契約的結構數據 2.使用系统的异常类型 [FaultContract(typeof(DivideByZeroException
那就是我们现在将要介绍的基于FaultContract的解决方案。我们知道WCF采用一种基于Contract,Contract定义了进行交互的双方进行消息交换所遵循的准则和规范。 Service Contract定义了包含了所有Operation的Service的接口,Data Contract定义了交互的数据的结构,而FaultContract实际上定义需要再双方之间进行交互的了异常 我们现在来看看如何来使用基于FaultContract的Exception Handling。 我们首先来定义一个表示Fault的类:MathError。 定义了MathError,我们需要通过FaultContract将其运用到Service Contract中制定的Operation上面,我们通过下面的方式来实现: using System; using Fault对应的类型,那么最终这个基于MathError类型的FaultContract会被写入Service Description中,Client通过获取该Service Description(一般是获取
给OperationContract 修饰的Divide方法加上FaultContract特性修饰。表明这个方法可能会抛DivideByZeroFault。 [ServiceContract] public interface ICalculatorService { [FaultContract(typeof(DivideByZeroFault
ServiceContract] public interface ICommodityManagerService { [OperationContract] [FaultContract OperationContract] CommodityModel GetOneCommodity(int id); [OperationContract] [FaultContract CommodityModel AddCommodity(CommodityModel oneCommodity); [OperationContract] [FaultContract
错误协定(FaultContract) 服务操作可以标记错误协定,表明这个方法可能会出现指定错误。 ?
5: public interface ICalculator 6: { 7: [OperationContract] 8: [FaultContract public interface ICalculator 6: { 7: [OperationContract(Name="Divide")] 8: [FaultContract 5: public interface ICalculator 6: { 7: [OperationContract] 8: [FaultContract
: public interface IProductService 9: { 10: [OperationContract] 11: [FaultContract 12: Product[] GetAllProducts(); 13: 14: [OperationContract] 15: [FaultContract Product GetProductByID(Guid productID); 17: 18: [OperationContract] 19: [FaultContract 7: public interface IOrderService 8: { 9: [OperationContract] 10: [FaultContract
异常处理:在WCF中,未处理的异常都是在一个更好的方式通过使用FaultContract处理,并没有得到Web服务SOAP(简单对象访问协议)故障返回给客户端等。
4: [OperationContract] 5: [ExceptionHandlingBehavior("myExceptionPolicy")] 6: [FaultContract
[OperationContract] 9: [ExceptionHandlingBehavior("myExceptionPolicy")] 10: [FaultContract