我使用comet 做一个信息提醒的时候,判断是否有信息,如果有 则直接返回给客户端,如果没有就将连接保存到监听器,但是当处于长连接状态时,服务端获得有消息不能返回给客户端,也不报错.我本机多少个请求都可以,但是放到IIS 里面 别的电脑使用的时候不能获得
我的代码:
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
{
                 string syt =context.User.Identity.Name;
                 //myAsynResult为实现了IAsyncResult接口的类,当不调用cb的回调函数时,该请求不会返回到给客户端,会一直处于连接状态
                 myAsynResult asyncResult = new myAsynResult(context, cb, extraData);
                 String content = context.Request.Params["content"];
                 string userid = context.User.Identity.Name;
                 //向Message类中添加该消息
                 SendWeibo.Instance().AddListener(userid, asyncResult);
                return asyncResult;
}
myAsynResult 的代码
public class myAsynResult : IAsyncResult
{
    bool _IsCompleted = false;
    private HttpContext context;
    private AsyncCallback cb;
    private object extraData;
    public myAsynResult(HttpContext context, AsyncCallback cb, object extraData)
    {
        this.context = context;
        this.cb = cb;
        this.extraData = extraData;
    }
    private string _content;
    public string Content
    {
        get { return _content; }
        set { _content = value; }
    }    #region IAsyncResult接口
    public object AsyncState
    {
        get { return null; }
    }    public System.Threading.WaitHandle AsyncWaitHandle
    {
        get { return null; }
    }    public bool CompletedSynchronously
    {
        get { return false; }
    }
    public bool IsCompleted
    {
        get { return _IsCompleted; }
    }
    #endregion    //在Message类中的添加消息方法中,调用该方法,将消息输入到客户端,从而实现广播的功能
    public void Send(object data)
    {
        context.Response.Write(this.Content);
        if (cb != null)
        {
            cb(this);
        }
        _IsCompleted = true;
    }
}
消息监听器代码        
  /// <summary>
    /// 添加消息监听器,如果查找到符合监听器条件的消息,返回false,此时不会添加监听器
    /// 如果没有查找到符合监听器条件的消息,返回true,此时监听器将被添加到m_Listeners中
    /// </summary>
    public void AddListener(string sender, myAsynResult asynResult)
    {
        //当传入的内容为"-1"时,表示为建立连接请求,即为了维持一个从客户端到服务器的连接而建立的连接
        //此时将该连接保存到 List<myAsynResult> clients中,待再有消息发送过来时,该连接将会被遍历,并且会将该连接输出内容后,结束该连接
        int userid = userid = Convert.ToInt32(sender);
        int uongs = 0;
        if (MessageCacheManagement.Instance.isExct(sender))
        {
            uongs =Convert.ToInt32( MessageCacheManagement.Instance.GetAll(sender));
        }
        else {
            uongs = bllaNameTb.getNumb(userid);
            MessageCacheManagement.Instance.Insert(userid.ToString(), uongs.ToString());
        }
        if (uongs <=0)
        {
            clients.Add(asynResult);        }
        else
        {
            //将当前请求的内容输出到客户端
            asynResult.Content = uongs.ToString();
            asynResult.Send(null);
            //遍历所有已缓存的client,并将当前内容输出到客户端
            foreach (myAsynResult result in clients)
            {
                result.Content = uongs.ToString();
                result.Send(null);
            }
            //清空所有缓存
           
            //clients.Clear();
        }
        MessageCacheManagement.Instance.Clear();
        
    }