stranquility 2016-02-27 01:49 采纳率: 0%
浏览 1323

.net comet在网上下载了一套简单的源码却一直调试不出来 可能问的问题比较基础 各位大神见谅

在网上查了半天消息推送 最后下载了一套comet+jquery简单源码示例 代码很简单就两个类
然而我初学这个东西 一直没有调试成功 看不大懂 求大神指导

下面贴源码 首先是config

 <httpHandlers>
      <add path="comet_broadcast.asyn" type="AsnyHandler" verb="POST,GET"/>
    </httpHandlers>

然后是AsnyHandler类的代码

 using System;
using System.Collections.Generic;
using System.Web;
using System.Threading;

/// <summary>
/// Summary description for AsnyHandler
/// </summary>
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);
        String content = context.Request.Params["content"];

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

    #region 不必理会

    public void EndProcessRequest(IAsyncResult result)
    {

    }

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

    public void ProcessRequest(HttpContext context)
    {
    }
    #endregion
}
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; ;
    }
}

Messages类的代码

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

/// <summary>
/// Summary description for Messages
/// </summary>
public class Messages
{
    //记录所有请求的客户端
    List<myAsynResult> clients = new List<myAsynResult>();

    #region 实现该类的单例
    private static readonly Messages _Instance = new Messages();
    private Messages()
    {
    }
    public static Messages Instance()
    {
        return _Instance;
    }
    #endregion

    public void AddMessage(string content,myAsynResult asyncResult)
    {
        //当传入的内容为"-1"时,表示为建立连接请求,即为了维持一个从客户端到服务器的连接而建立的连接
        //此时将该连接保存到 List<myAsynResult> clients中,待再有消息发送过来时,该连接将会被遍历,并且会将该连接输出内容后,结束该连接
        if (content=="-1")
        {
            clients.Add(asyncResult);
        }
        else
        {
            //将当前请求的内容输出到客户端
            asyncResult.Content = content;
            asyncResult.Send(null);

            //否则将遍历所有已缓存的client,并将当前内容输出到客户端
            foreach (myAsynResult result in clients)
            {
                result.Content = content;
                result.Send(null);
            }

            //清空所有缓存
            clients.Clear();
        }
    }
}

前端请求代码

 $(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();
        }
    });
});

这是最初的源码 在本地调试的时候会提示找不到comet_broadcast.asyn这个文件,
源码中也确实没有这个文件 这也是我最大的疑问 然后网上查了下 有人说把后缀改为.ashx也就是一般处理程序 不知道这样对不对 却不知道这个里面的代码改怎么写 怎样去调用AsnyHandler类里面的BeginProcessRequest方法 囧 这对只会一些基础代码的我来说确实有点难度 求哪位大神能够指导一下 谢谢了

  • 写回答

1条回答 默认 最新

  • s_tranquility 2016-02-27 02:24
    关注

    囧 没有人啊 0.0自己顶顶

    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮