1. 永远都不要在异常抛出之后使用代理实例,即使你捕获了该异常。
说明:当客户端抛出异常之后,就会出现通道访问服务异常,通道出现异常,只能关闭服务代理。
2. 避免错误契约,并允许WCF屏蔽错误。
3. 在异常抛出之后不要重用回调通道,即使你捕获了该异常,因为通道可能已经发生了错误。
4. FaultContract特性中包含的类型应该是异常类类型,而不是单纯的可序列化类型:
//避免
[OperationContract]
[FaultContract(typeof(double))]
Double Divide(doublenumber1,double number2);
//正确
[OperationContract]
[FaultContract(typeof(DivideByZeroException))]
double Divide(doublenumber1, double number2);
5. 避免耗时过长的处理,例如IErrorHandler.ProvideFault()方法中的日志操作。
说明:任何一个操作错误,在实例释放之前,都会调用ProvideFault()方法。
6. 测试状态下,服务类与回调类的IncludeExceptionDetailInFaults值均应设置为true,可以在配置文件中配置,也可以采用编程方式:
public class DebugHelper
{
public constbool IncludeExceptionDetailInFaults =
#if DEBUG
true;
#else
false;
#endif
}
[ServiceBehavior(IncludeExceptionDetailInFaults=
DebugHelper.IncludeExceptionDetailInFaults)]
class MyService :IMyContract
{}
7. 构建交付版本时,除了诊断场景,不要将未知异常作为错误返回。
8. 如果要提升异常为错误契约,并实现自动地错误日志记录,可以考虑在服务上使用ErrorHandlerBehavior特性:
[ErrorHandlerBehavior]
class MyService :IMyContract
{}
9. 如果要提升异常为错误契约,并实现自动地错误日志记录,可以考虑在回调客户端上使用CallbackErrorHandlerBehaviorAttribute特性:
[CallbackErrorHandlerBehaviorAttribute]
class MyClient :IMyContractCallback
{
public voidOnCallback()
{}
}