Esempio n. 1
0
        public void ProcessRequest(HttpContext context)
        {
            context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            context.Response.ContentType = "text/plain";
            string value = context.Request.Params.Get(DATAFIELD);

            if (String.IsNullOrEmpty(value))
            {
                context.Response.Write("500 create connection error.");
                return;
            }

            try
            {
                AliveClient ac = new AliveClient(null);
                //加入缓存
                AsyncManager.AddClient(ac);
                //直接回复
                context.Response.Write("收到回复");
            }
            catch (Exception ex)
            {
                logger.Error("创建连接发生错误:" + ex.Message);
            }
        }
 public static void AddClient(AliveClient client)
 {
     if (client == null)
     {
         return;
     }
     lock (syncObj) {
         clients.Add(client);
     }
 }
        /// <summary>
        /// 心跳回复
        /// </summary>
        public static void Heart()
        {
            AliveClient c = null;

            lock (syncObj) {
                for (int i = 0; i < clients.Count; i++)
                {
                    c = clients[i];
                    logger.Info("回复:111111");
                    c.Send("服务器端推,有数据啦....");
                }
            }
        }
        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
        {
            context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            string value = context.Request.Params.Get(DATAFIELD);

            //这里传过来的是SessionId,不是数据,数据不做重复Parse
            //用sessionId去缓存中找对应的会话,并填充异步AsyncResult
            HKAsyncRequest result = new HKAsyncRequest(context, cb, extraData);
            string         error  = null;

            if (String.IsNullOrEmpty(value))
            {
                error = "500 SessionId is null";
                context.Response.StatusCode = 500;
                logger.Error(error);
                result.Send(error);
                return(result);
            }

            List <AliveClient> acs = AsyncManager.Sessions.FindAll(x => x.SessionId.Equals(value));

            if (acs == null || acs.Count == 0)
            {
                error = "404 SessionId:" + value + " has no connection.";
                context.Response.StatusCode = 404;
                logger.Debug(error);
                result.Send(error);
                return(result);
            }

            AliveClient ac = acs.First();

            ac.Result = result;
            //执行命令

            return(result);
        }
        public static void Clean()
        {
            int maxTimeSpan = Int32.Parse(ConfigurationManager.AppSettings["maxTimeSpan"]);

            int comepleteCount = 0;
            int overTimeCount  = 0;
            int invalidCount   = 0;

            AliveClient ac = null;

            lock (syncObj)
            {
                for (int i = 0; i < clients.Count; i++)
                {
                    ac = clients[i];
                    if (ac == null)
                    {
                        continue;
                    }
                    else if (ac.IsCompleted)
                    {
                        //完成请求
                        comepleteCount += 1;
                        clients.Remove(ac);
                    }
                    else if ((DateTime.Now - ac.CreateTime).Minutes > maxTimeSpan)
                    {
                        //超时请求
                        overTimeCount += 1;
                        clients.Remove(ac);
                    }
                    String msg = String.Format("完成一次清理任务:无效请求:%s ; 超时请求:%s ; 已完成请求:s%", invalidCount.ToString(), overTimeCount.ToString(), comepleteCount.ToString());
                    logger.Info(msg);
                }
            }
        }