一般对于提供出来的接口,虽然知道在哪些业务场景下才会被调用,但是不知道什么时候被调用、调用的频率、接口性能,当出现问题的时候也不容易重现请求;为了追踪这些内容就需要把每次接口的调用信息给完整的记录下来,也就是记录日志。日志中可以把调用方ip、服务器ip、调用时间点、时长、输入输出 ...
一般对于提供出来的接口,虽然知道在哪些业务场景下才会被调用,但是不知道什么时候被调用、调用的频率、接口性能,当出现问题的时候也不容易重现请求;为了追踪这些内容就需要把每次接口的调用信息给完整的记录下来,也就是记录日志。日志中可以把调用方ip、服务器ip、调用时间点、时长、输入输出都给完整的记录下来,有了这些数据,排查问题、重现异常、性能瓶颈都能准确的找到切入点。
这种功能,当然没人想要去在每个Operation里边插入一段代码,如果有类似AOP的玩意就再好不过了。
get='_blank'>wcf中有IDispatchMessageInspector分发消息检查器这么个玩意,
1 namespace System.ServiceModel.Dispatcher 2 { 3 using System; 4 using System.ServiceModel; 5 using System.ServiceModel.Channels; 6 7 public interface IDispatchMessageInspector 8 {
亦即允许我们对进出服务的消息进行检查和修改,这看起来有点像mvc的过滤器
执行过程: AfterReceiveRequest -> wcf操作 -> BeforeSendReply
切入点找到了,需要做的就是实现这个接口方法,记录日志,还可以计算一段时间内访问的次数并设置相应的阀值也就是可以实现并发限流,限流的目的主要是防止恶意调用维持己方服务器的稳定。
实现思路:
1 public class ThrottleDispatchMessageInspector : IDispatchMessageInspector 2 { 3 public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 4 { 5 // [并发限流] 6 以ContractName+OperationName 作为MemoryCache的键,值为调用次数; 设置绝对过期时间 7 if(次数 > 设定的阀值) 8 request.Close(); 直接关闭请求 9 10 // [log] 记录请求输入消息、开始时间、服务器ip、客户端ip、 访问的wcf契约和方法... 11 LogVO log12 // [log] 将日志实体作为返回值13 return log;14 15 }16 public void BeforeSendReply(ref Message reply, object correlationState) {17 //[log]补充完整log的属性: 请求结束时间, 调用时长... 然后将log丢入队列(不直接插数据库,防止日志记录影响接口性能) 慢慢落地rds中18 var log = correlationState as LogVO;19 log => Queue 20 } 21 }
原标题:wcf利用IDispatchMessageInspector实现接口监控日志记录和并发限流
关键词:wcf
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。