我使用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();
}
我的代码:
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();
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货