你的位置:首页 > ASP.net教程

[ASP.net教程]实时监控Cat之旅~对请求是否正常结束做监控(分布式的消息树)


对基于请求的分布式消息树的分析

在MVC时有过滤器System.Web.Mvc.ActionFilterAttribute,它可以对action执行的整个过程进行拦截,执行前与执行后我们可以注入自己的代码,这是我们实现对请求做监控的前提,对于一个请求来说,如果它是从Get或者Post过来的,我们会在发起端将初始catContext进行链条式的传递,从第一个节点开始生成并传递,最后到尾结节,开始执行cat,生成新的context,将新的context回写到响应头,由上一个节点拿到这个响应头,开始写自己的cat,这个过程最后执行到第一个节点,整个过程结束!

对消息树流程的设计

代码的实现

下面开始设计咱们的Filter拦截器,用来生成catContext,并将处理后的context写响应头中

  /// <summary>  /// Cat拦截器,主要拦截Http请求  /// </summary>  public class CatFilter : System.Web.Mvc.ActionFilterAttribute  {    /// <summary>    /// 请求来到时    /// </summary>    /// <param name="filterContext"></param>    public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)    {      base.OnActionExecuting(filterContext);    }    /// <summary>    /// 请求结束时    /// 调用次序:A->B->C->c->b->a,从c开始执行,把context结果在响应头里依据向回传    /// </summary>    /// <param name="filterContext"></param>    public override void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext)    {      var context = PureCat.CatClient.GetCatContextFromServer();      if (context != null)      {        context = PureCat.CatClient.DoTransaction("youDomain", filterContext.HttpContext.Request.Url.AbsoluteUri, () =>        {          PureCat.CatClient.LogRemoteCallServer(context);          PureCat.CatClient.LogEvent(filterContext.HttpContext.Request.Url.AbsoluteUri, "Action Finish...");          if (filterContext.Exception != null)          {            PureCat.CatClient.LogError(filterContext.Exception);          }        });        #region 响应头写数据        if (filterContext.HttpContext.Response.Headers.GetValues("catContext") != null          && filterContext.HttpContext.Response.Headers.GetValues("catContext").Length > 0)        {          filterContext.HttpContext.Response.Headers.Remove("catContext");        }        filterContext.HttpContext.Response.Headers.Add("catContext", Lind.DDD.Utils.SerializeMemoryHelper.SerializeToJson(context));        #endregion      }      base.OnActionExecuted(filterContext);    }  }

最后就是修改我们之前封装的GET和POST方法,让它处理一下响应头,使用响应头的context作为当前cat的上下文

 /// <summary>    /// Get数据    /// </summary>    /// <param name="requestUri"></param>    /// <returns></returns>    public static HttpResponseMessage Get(string requestUri, bool isCat)    {      var handler = new HttpClientHandler() { };      using (var http = new HttpClient(handler))      {        PureCat.CatClient.SetCatContextToServer(http, GetCurrentContext("Get Request Sent...", isCat));//设置接口api的头,发送        var response = http.GetAsync(requestUri).Result;        var context = response.Headers.Where(i => i.Key == "catContext");        if (context != null && context.Count() > 0)        {          var cat = Lind.DDD.Utils.SerializeMemoryHelper.DeserializeFromJson<CatContext>(context.First().Value.FirstOrDefault());          PureCat.CatClient.SetCatContextToServer(System.Web.HttpContext.Current, cat);        }        return response;      }    }

日志的生成

最后生成的cat日志也是我们可以理解的,即从a,b,c,d的调用,在执行结束的监控顺序是d,c,b,a,呵呵,并且在在step2时故意放了一个异常出来,让cat记录一下,呵呵。

海岛旅游费用多少海岛旅游哪里好玩海岛旅游行程深圳到海岛旅游深圳去海岛旅游报价西安世园会使西部旅游版图悄然发生改变 在大同领略大不同 关于开展旅游标准化试点中期评估工作的通知 中国第一水乡周庄旅游攻略 普吉岛旅游能品尝什么特色美食? 从南宁自助去泰国,芭提雅,普吉岛,路线费用如何? 泰国旅游签证费需要多少钱? 十一去马尔代夫旅游人会不会多啊? 龙潭大峡谷门票_龙潭大峡谷门票价格_龙潭大峡谷门票多少钱 男孩节 成都新世纪环球中心_新世纪环球中心景点介绍 上海碧海金沙门票_碧海金沙水上乐园门票_奉贤碧海金沙门票多少钱 韶关市动物园地址?韶关动物园门票多少钱? 韶关有动物园吗?韶关华南虎动物园地址? 韶关动物园地址?韶关华南虎去哪看? 韶关市华南虎动物园在哪里?华南虎动物园旅游攻略? H175CPGD Datasheet H175CPGD Datasheet H175CRD Datasheet H175CRD Datasheet H175CSRD Datasheet H175CSRD Datasheet 蜈支洲岛旅游 蜈支洲岛旅游 蜈支洲岛旅游 亚洲游 亚洲游 亚洲游 台湾日月潭天气 台湾日月潭天气 台湾日月潭天气