WCF异常处理

WCF中,如果没有指定,服务端的异常不会传递到客户端,如:在等于0时,客户端根本不知道异常的原因据,也即"Divsion by zero!"异常信息不会传到客户端。

[ServiceContract]
public   class  CalculatorService
{
    [OperationContract] 
    
int Divide(int a, int b)
    
{
        
if (b==0throw new Exception(“Division by zero!”);
        
return a/b;
    }

}

 

在最简单的情况下,我们可以使用空FaultException(它只包含一个string字符串,称为错误原因), 如下所示:

[ServiceContract]
public   class  CalculatorService
{
    [OperationContract] 
    
int Divide(int a, int b)
    
{
         
if (b==0throw new FaultException(“Division by zero!”);
         
return a/b;
    }

}

 

当然,我们可以定义强类型的异常信息,并在方法上运用FaultContractAttribute来指定它,如下所示:

[DataContract]
public   class  MathFault
{
     [DataMember]
    
public string operation;

     [DataMember] 
    
public string description;
}


[ServiceContract]
public   class  CalculatorService
{
    [FaultContract(
typeof(MathFault))]
    [OperationContract] 
    
int Divide(int a, int b)
    
{
         
if (b==0)
         
{
             MathFault m 
= new MathFault();
             m.operation
=/”;
             m.description
=”Division by zero!”;
             
throw new FaultException<MathFault>(m);
        }

        
return a/b;
    }

}

注意:不能用XmlSerializer来序列化Fault相关的对象实例,即使在其上使用了XmlSerializerFormatAttribute属性。

为了调试目的,可以用ReturnUnknownExceptionsAsFaults配置项(配置文件)或是在服务上使用ServiceBehaviorAttribute 属性来将所有异常作为Fault返回给客户端, 如下所示: 

[ServiceContract]
[ServiceBehavior(ReturnUnknownExceptionsAsFaults
= true )]
public   class  CalculatorService
{
    [OperationContract] 
int Divide(int a, int b)
    
{
        
return a/b; // This may throw the DivideByZeroException.
    }

}

但是这种方式绝不应该在产品布署中使用,因为它是.Net平台专用的,在WSDL中不会有异常信息的描述,这会导致服务端与客户端的紧耦合, 而且这种方式会暴露内部实现机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值