大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > ASP.NET技巧 > Asp.Net实现Http长连接推送

Asp.Net实现Http长连接推送(2)

关键词:Asp.NetHttp长连接推送  阅读(1996) 赞(16)

[摘要]本文是对Asp.Net实现Http长连接推送的讲解,对学习ASP.NET编程技术有所帮助,与大家分享。

这个类没有什么难的,主要是保存外部传进来的HttpContext、AsyncCallBack和ExtraData,HttpContext用来向Response中写回应,AsyncCallBack用来结束当前Http长连接请求,ExtraData自己该干什么干什么我没有用它。这里需要注意的是这个类中的CompletedSynchronously属性要返回false,不然客户端收不到数据。而且各个属性也别随便返回null,不然在写入Response时会报空指针的错误。

下面我们看看另一个接口的实现。在项目中新建一个一般处理程序(.ashx)文件。实现IAsyncHandler接口:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using log4net;
using Newtonsoft.Json.Linq;

namespace SM.BIZKeepAliveHttp
{
    public class Data : IHttpAsyncHandler
    {

        public static readonly string DATAFIELD = "data";
        private static readonly ILog logger = LogManager.GetLogger(typeof(Data));

        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;
            //执行命令
            CommondFactory.ExecuteCommond(ac);

            return result;
        }

        public void EndProcessRequest(IAsyncResult result)
        {
        }


        public void ProcessRequest(HttpContext context)
        {
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}


相关评论