在实际的应用程序中,可能经常会遇到在Service端如何统一处理异常,记Log等的问题。这些问题可能很多AOP框架已经给出了解决方案。其实对于WCF来说简单的做一下扩展就可以解决这个问题了。
由于处理异常,记日志主要针对的是Operation级别,所以我选择的扩展点是IOperationInvoker接口,这个接口提供在Operation调用时的拦截。先看一下它的定义:

Extending WCF(四)—一个统一处理异常、日志的解决方案public interface IOperationInvoker

它提供了同步和异步调用Operation的方法。调用Operation的过程当然还是由WCF本身来完成,我们要做的就是在调用前和调用后来做日志和处理异常。下面是我的实现类:

Extending WCF(四)—一个统一处理异常、日志的解决方案public class MyInvoker : IOperationInvoker
}

在PreInvoke和PostInvoke方法中可以加入我们自己的代码。InterceptionType是一个枚举,里面定义了拦截的类型:

Extending WCF(四)—一个统一处理异常、日志的解决方案public enum InterceptionType
}
这个枚举可以根据需要来进行扩展。如何让WCF使用我们自己的这个OperationInvoker呢,可以通过加入Operation Behavior来完成:
Extending WCF(四)—一个统一处理异常、日志的解决方案[AttributeUsage(AttributeTargets.Method)]
Extending WCF(四)—一个统一处理异常、日志的解决方案
public class MyOperationInterceptorAttribute : Attribute, IOperationBehavior
}
在ApplyDispatchBehavior中换掉原来的Invoker就可以了。所以我们只要在Operation上打上这个标签就可以了,并且在打标签的同时可以指定拦截的类型。
这样可能还比较麻烦,因为我要挨个方法都去打上标签,那么我们可以往更高层次的Behavior去扩展。这里可以使用Service Behavior:
Extending WCF(四)—一个统一处理异常、日志的解决方案[AttributeUsage(AttributeTargets.Class)]
Extending WCF(四)—一个统一处理异常、日志的解决方案
public class MyServiceInterceptorAttribute : Attribute,IServiceBehavior
}
ApplyDispatchBehavior这个方法中会去给没有打上标签的Operation都打上标签。所以我们只需要给Service打个标签就可以了。

通过这个简单的实例,我们就可以对Operation级别的异常和日志进行统一的处理了,代码中的try catch和记录日志的代码就可以通通省去了。

相关文章:

  • 2021-11-07
  • 2021-05-31
  • 2022-02-16
  • 2021-11-07
  • 2022-12-23
  • 2022-03-01
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-09-20
  • 2022-12-23
  • 2022-01-16
  • 2021-06-09
  • 2021-05-27
  • 2022-12-23
相关资源
相似解决方案