使用IHttpAsyncHandler实现长连接,当http请求增加时,连接非常慢,求解决

DiorsManForU 2015-08-11 01:59:45
代码片段:
前端js代码
/// <reference path="jquery-1.3.2.min.js" >
$(document).ready(function () {
function send() {
//向comet_broadcast.asyn发送请求,消息体为文本框content中的内容,请求接收类为AsnyHandler
$.post("comet_broadcast.asyn", { content: $("#content").val() });

//清空内容
//$("#content").val("");
}

function wait() {
$.post("comet_broadcast.asyn", { content: "-1" },
function (data, status) {
var result = $("#divResult");
result.html(result.html() + "<br/>" + data);

//服务器返回消息,再次立连接
wait();
}, "html"
);
}

//初始化连接
wait();

$("#btnSend").click(function () { send(); });
$("#content").keypress(function (event) {
if (event.keyCode == 13) {
send();
}
});
});


服务端代码:

public class AsnyHandler : IHttpAsyncHandler
{
public AsnyHandler()
{
}

public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
//myAsynResult为实现了IAsyncResult接口的类,当不调用cb的回调函数时,该请求不会返回到给客户端,会一直处于连接状态
myAsynResult asyncResult = new myAsynResult(context, cb, extraData);
asyncResult.ClientID = context.Request.UserHostAddress;

String content = context.Request.Params["content"];

//向Message类中添加该消息
Messages.Instance().AddMessage(asyncResult.ClientID, content, asyncResult);
return asyncResult;
}

#region 不必理会

public void EndProcessRequest(IAsyncResult result)
{

}

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

public void ProcessRequest(HttpContext context)
{
}
#endregion
}

配置文件: <add verb="GET,POST" path="comet_broadcast.asyn" type="IHttpAsyncHandlerCS.Base.AsnyHandler, IHttpAsyncHandlerCS"/>


public class myAsynResult : IAsyncResult
{
bool _IsCompleted = false;
private HttpContext context;
private AsyncCallback cb;
private object extraData;

public string ClientID { get; set; }
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; ;
}
}


当打开多个页面进行长连接通信时(超过10页),页面响应非常慢,并收不到发送的信息。望大神解决。
...全文
212 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Roger370 2016-03-16
  • 打赏
  • 举报
回复
楼主你好,我用了和你一样的方法来实现长连接,但是为什么同时只有一个页面的请求有效,如果打开第二个页面,之前的长连接就断开了,望请指教。
guanyelong 2015-08-11
  • 打赏
  • 举报
回复
给我的感觉就是一般的长连接都非常消耗系统资源,如果做个简简单单的视频通信或者简单的聊天什么的都可以用socket或者flex。网上许多例子。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧