.NET MVC 下实现消息推送

CometController.cs

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CometMvcDemo.Models;

namespace CometMvcDemo.Controllers
{
    public class CometController : AsyncController
    {
        private AsyncCallback cb;
        object extraData;
        HttpContext context;

        //
        // GET: /Comet/

        public ActionResult Index()
        {
            var strUid = Request["strUid"];
            ViewData["strUid"] = strUid;
            return View();
        }

        //LongPolling Action 1 - 处理客户端发起的请求
        public void LongPollingAsync()
        {
            //计时器,5秒种触发一次Elapsed事件
            System.Timers.Timer timer = new System.Timers.Timer(5000);

            //告诉ASP.NET接下来将进行异步操作
            AsyncManager.OutstandingOperations.Increment();

            //订阅至计时器的Elapsed事件
            timer.Elapsed += (sender, e) =>
            {
                //保存将要传递给LongPollingCompleted的参数
                AsyncManager.Parameters["now"] = e.SignalTime;

                //告诉ASP.NET异步操作已完成,进行LongPollingCompleted方法的调用
                AsyncManager.OutstandingOperations.Decrement();
            };
            //启动计时器
            timer.Start();
        }

        //LongPolling Action 2 - 异步处理完成,向客户端发送响应
        /*
        public ActionResult LongPollingCompleted(DateTime now)
        {
            return Json(new
            {
                d = now.ToString("MM-dd HH:mm:ss ") +
                    "-- Welcome to cnblogs.com!"
            },
                JsonRequestBehavior.AllowGet);
        }
        */

        /// <summary>
        /// 
        /// </summary>
        /// <param name="context"></param>
        /// <param name="cb"></param>
        /// <param name="extraData"></param>
        /// <returns></returns>
        public void LongPollingCompleted()
        {
            //var oContext = HttpContext.Profile;
            context = System.Web.HttpContext.Current;
            string _UID = context.Request.Params["uid"];

            WebIMClientAsyncResult _AsyncResult = new WebIMClientAsyncResult(context,cb,null);

            string _Content = context.Request.Params["content"];
            string _Action = context.Request.Params["action"];

            if (_Action == "login")
            {
                _UID = context.Request.Params["uid"];
                _AsyncResult.LoginID = _UID;
                WebIMMessageHandler.Instance().Login(_UID, _AsyncResult);
            }
            else if (_Action == "logout")
            {
                _AsyncResult.LoginID = _UID;
                WebIMMessageHandler.Instance().Logout(_UID, _AsyncResult);
            }
            else if (_Action == "connect")
            {
                _AsyncResult.LoginID = _UID;
                WebIMMessageHandler.Instance().Connect(_AsyncResult);
            }
            else if (_Action == "getuserlist")
            {
                _AsyncResult.LoginID = _UID;
                WebIMMessageHandler.Instance().GetUserList(_AsyncResult);
            }
            //增加消息发送
            else if (_Action == "sendmsg")
            {

                _AsyncResult.LoginID = _UID;

                //WebIMMessageHandler.Instance().GetUserList(_AsyncResult);

                //调用
                WebIMMessageHandler.Instance().AddMessage(_Content, _AsyncResult);

            }

            //调用
            //WebIMMessageHandler.Instance().AddMessage(_Content, _AsyncResult);
            //return _AsyncResult;
            //return Json(_AsyncResult.Content,JsonRequestBehavior.AllowGet);
        }
    }
}

WebIM.js

View Code
//登录,登录成功后,获取在线用户列表,
function login() {

    //var strUrl = '/Comet/LongPolling';

    //$.post("comet_broadcast.asyn", { action: 'login', uid: strUid },
    $.post('/Comet/LongPolling', { action: 'login', uid: strUid },
       function (data, status) {
           if (data == "OK") {
               _logined = true;
               getuserlist();
           }
           else {
               //alert(data);
               Ext.Msg.alert("提示",data);
           }
       });
}

//获取在线用户列表,获取列表后,进入消息等待
function getuserlist() {
    $.post('/Comet/LongPolling', { action: 'getuserlist', uid: strUid },
        function (data, status) {
            //alert('getuserlist' + data);
            var result = $("#divResult");
            result.html(result.html() + "<br/>" + "用户列表:" + data);

            wait();
        });
}

//退出
function logout() {
    $.post('/Comet/LongPolling',
     { action: 'logout', uid: strUid },
        function (data, status) {
            _logined = false;
            alert(data);
        }
         );
}

//消息等待,接收到消息后显示,发起下一次的消息等待
function wait() {
    $.post('/Comet/LongPolling', { action: 'connect', uid: strUid },
           function (data, status) {

               /*
               var result = $("#divResult");
               result.html(result.html() + "<br/>" + "用户列表:" + data);
               */

               /*
               //2.窗口
               var strSubData = GetSubStrBySpecChar(data, ':');

               if (strSubData == 'Msgs') {
                   new Ext.ux.ToastWindow({
                       title: '提示窗口',
                       html: data,
                       iconCls: 'error'
                   }).show(document);
               }
               else if (strSubData == 'Users') {
                   //暂时不处理
               }
               else {

                   new Ext.ux.ToastWindow({
                       title: '提示窗口',
                       html: data,
                       iconCls: 'error'
                   }).show(document);
               }

               //服务器返回消息,再次建立连接
               if (_logined) {
                   wait();
               }
               */

               new Ext.ux.ToastWindow({
                   title: '提示窗口',
                   html: 'HAHAH',
                   iconCls: 'error'
               }).show(document);

               //服务器返回消息,再次建立连接
               if (_logined) {
                   wait();
               }

           }, "html");
}

//附加事件
///$("#btnLogin").click(function () { if ($("#txtLoginID").val() == '') alert('空'); login(); });
$("#btnLogout").click(function () { logout(); });

/*发送消息*/
function send() {

    //$.post("comet_broadcast.asyn", { action: 'sendmsg', uid: $("#txtLoginID").val(), content: $("#content").val() },
    $.post('/Comet/LongPolling', { action: 'sendmsg', uid: strUid, content: $("#content").val() },
        function (data, status) {

            /*
            var result = $("#divResult");
            result.html(result.html() + "<br/>" + "已发消息:" + data);
            */

            //发送方页面提示
            //潜规则:暂时不处理
            //2.窗口
            /*
            new Ext.ux.ToastWindow({
            title: '提示窗口',
            html: data,
            iconCls: 'error'
            }).show(document);
            */

        }, "html"
        );

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

/**
* 获取字符串中某个特殊字符首次出现的位置之前的子串
*/
function GetSubStrBySpecChar(strConnStr, strSplit) {

    var arrStr = strConnStr.split(strSplit);
    var strSubStr = arrStr[0];

    return strSubStr;

}

 

posted @ 2013-03-10 22:26  楠木大叔  阅读(1221)  评论(1编辑  收藏  举报