使用ASP.NET MVC 4 Async Action+jQuery实现消息通知机制的实现代码

 更新时间:2013年02月26日 16:36:30   作者:   我要评论

这两天在使用Asp.net MVC 4开发COMET消息通知机制,在后端使用异步线程对消息进行订阅,客户端通过AJAX长连接请求MVC中的ACTION

这两天在使用Asp.net MVC 4开发COMET消息通知机制,在后端使用异步线程对消息进行订阅,客户端通过AJAX长连接请求MVC中的ACTION,如:http://localhost/event/imageSet,即表示获取ImageSet对象的变更消息(新增,更新和删除消息)。

1.事件消息的类IEventEntity<TEntity>类的定义

复制代码 代码如下:

public interface IEntityEvent<TEntity>
    {
        //变更的实体类对象
        TEntity[] Entities
        {
            get;
        }

        //操作类型
        EntityEventType Type
        {
            get;
        }
    }

    public enum EntityEventType : int
    {
        Create = 0,
        Update = 1,
        Removed = 2
    }


2.EntityEventController类

复制代码 代码如下:

[SessionState(SessionStateBehavior.ReadOnly)]
    public class EntityEventController : Controller
    {
        //异步获取对ImageSet对象操作的变更事件Action,millsecondsTimeout为超时时间。
        public async Task<ActionResult> ImageSet(int millisecondsTimeout = 10000)
        {
            return await this.EventAsync<ImageSetData>(millisecondsTimeout);
        }

        private async Task<ActionResult> EventAsync<TEntity>(int millisecondsTimeout)
        {
            IEntityEvent<TEntity> entityEvent = await EntityEventSubcriber.Instance.WaitForEntityEvent<TEntity>(millisecondsTimeout);

            return this.Json(new
            {
                HasEvent = null != entityEvent,
                EntityEvent = entityEvent

            }, JsonRequestBehavior.AllowGet);
        }
    }


(1)这里使用到了.Net Framework 4.5中使现异步asp.net mvc async action(可以参考:Using Asynchronous Methods in ASP.NET MVC 4 技术文章)的技术,其中方法前的async关键字可以和Task对象进行配合使用,表示该方法为异步方法,由编译器生成运行时所需的相关异步操作的逻辑代码,另外方法中必须使用到await语句来等待一个异步操作的结束,await和Task<T>结合来返回Task完成的Result

(2) 如果Controller层面应用或者Filter中操作过Session,那么为了避免长链接时不会导至同一Session在其他调用中Session Block的情况,需要在Controller头上加入[SessionState(SessionStateBehavior.ReadOnly)] 的Attribute,来表示当前Controller对Session为只读操作,这样就其他操作就不会被阻塞了。

3.这里就不具体写EntityEventSubscriber消息订阅器的代码了,以后将在“消息订阅与发布”的文章中详细描述。

4.jQuery AJAX客户端代码

复制代码 代码如下:

$(document).ready(function () {

        var $hoverList = $("#imageSets").hoverList({title:"图片集列表", selectedIndex: 1 });

        var getEvent = function(){

            var getPattern = "/EasyshirtBackend/imageSet/0";

            $.getJSON("/EasyshirtBackend/event/imageSet/100000" , function(data){

                if(data.HasEvent){

                    //Create
                    if(data.EntityEvent.Type == 0){

                        $.each(data.EntityEvent.Entities, function(i, entity){

                //TODO: 处理实体类新增

                            if(i == data.EntityEvent.Entities.length - 1){

                                getEvent();
                            }
                        });

                        return;
                    }

                    //Update
                    if(data.EntityEvent.Type == 1){

                        $.each(data.EntityEvent.Entities, function(i, entity){

                            //TODO: 处理实体类更新

                            if(i == data.EntityEvent.Entities.length - 1){

                                getEvent();
                            }
                        });

                        return;
                    }


                    //Delete
                    if(data.EntityEvent.Type == 2){

                        $.each(data.EntityEvent.Entities, function(i, entity){

                            //TODO: 处理实体类删除

                            if(i == data.EntityEvent.Entities.length - 1){

                                getEvent();
                            }
                        });
                    }

                }else{

                    $("#imageSets").hoverList("add", data);
                    getEvent();
                }
            });
        };

        getEvent();
    });


代码中主要需要控制住在一次获得消息(无论是有消息还是无消息),都需要在恰当的时机现一次的调用getEvent()方法来进行消息获取的循环。

相关文章

  • ASP.NET MVC5验证系列之客户端验证

    ASP.NET MVC5验证系列之客户端验证

    这篇文章主要为大家详细介绍了ASP.NET MVC5验证系列之客户端验证,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • asp.net jscript 一句话木马

    asp.net jscript 一句话木马

    asp.net jscript 一句话木马...
    2007-08-08
  • 分享一个取自HoverTree项目的.NET分页类

    分享一个取自HoverTree项目的.NET分页类

    分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一。对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,今天我们给大家分享一个取自HoverTree项目的.NET分页类。
    2015-04-04
  • Aspose.Cells组件导出excel文件

    Aspose.Cells组件导出excel文件

    这篇文章主要介绍了利用Aspose.Cells组件导出excel文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Asp.net利用JQuery弹出层加载数据代码

    Asp.net利用JQuery弹出层加载数据代码

    最近看QQ空间里面的投票功能很使用。点击一个链接就弹出一个层,然后再加载一些投票信息,旁边的区域变成灰色不可用状态。其实这不算什么高深的技术,只要在ASP.NET中利用JQuery结合一般处理程序ASHX即可搞定了。
    2009-11-11
  • asp.net实现输出xml的方法

    asp.net实现输出xml的方法

    这篇文章主要介绍了asp.net实现输出xml的方法,涉及asp.net针对xml节点的查询、创建、修改、生成等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • asp.net实现的计算网页下载速度的代码

    asp.net实现的计算网页下载速度的代码

    刚看到有人给出asp.net实现的计算网页下载速度的方法,本方法未经本人测试,不知道能否可靠性如何。准确来说,这只是个思路吧
    2013-03-03
  • WPF中自定义GridLengthAnimation

    WPF中自定义GridLengthAnimation

    这篇文章主要为大家详细介绍了WPF中自定义GridLengthAnimation的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • .net调用JScript脚本及JS url加密解密

    .net调用JScript脚本及JS url加密解密

    .net调用JScript脚本及JS url加密解密,需要的朋友可以参考一下
    2013-03-03
  • Asp.net静态方法之Grid转DataTable方法实现步骤

    Asp.net静态方法之Grid转DataTable方法实现步骤

    GridView绑定DataTable后,如何获取GridView绑定后显示的值,在项目需求的背景下写了一个静态方法,经过在项目中的使用,bug的修复,较为稳定
    2013-04-04

最新评论