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

这两天在使用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()方法来进行消息获取的循环。

(0)

相关推荐

  • ASP.NET实现MVC中获取当前URL、controller及action的方法

    本文实例讲述了ASP.NET实现MVC中获取当前URL.controller及action的方法.分享给大家供大家参考,具体如下: URL的获取很简单,ASP.NET通用: [1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟目录名+页面名+参数: string url=Request.RawUrl; 或 string url=Request.Url.PathAndQuery; [3]获取 虚拟

  • 解读ASP.NET 5 & MVC6系列教程(10):Controller与Action

    我们知道在MVC5和之前的版本,两个框架的生命周期是不一样的,在新版MVC6中,MVC Controller/Web API Controller已经合二为一了,本章我们主要讲解Controller和Action的定义与使用,以及在MVC框架中,如何根据路由查询相应的Controller和Action. Controller&Action的定义和使用 在新版MVC6框架中,依然提供了一个Controller基类,在这里除了依然提供了Url.RouteData.HttpContext.Reques

  • ASP.NET MVC 控制器与视图

    一.控制器相关 在Controller类中方法访问级别为public的方法,就是行为(Action).如果不希望Controller类中的方法成为Action(可以在地址栏中被访问),有两种实现方式:将方法的访问级别设置为private在方法上添加特性标记[NonAction] 诸如新增\修改等功能模块,我们往往会创建2个名称相同的Action:一个action用于加载新增\修改页面;另一个action用于处理新增\修改页面提交的表单数据.那么如何区分在何时调用哪个action呢? 我们将加载新

  • asp.net mvc-Controllerl篇 ControllerDescriptor

    现在我们首先来看看ActionInvoker属性的定义吧: 复制代码 代码如下: public IActionInvoker ActionInvoker { get { if (_actionInvoker == null) { _actionInvoker = CreateActionInvoker(); } return _actionInvoker; } set { _actionInvoker = value; } } protected virtual IActionInvoker C

  • asp.net MVC实现无组件上传图片实例介绍

    例子: 如我想上传一个图片到服务器端:asp页面 复制代码 代码如下: <form id="form1" runat="server" action="/bookIndex/fileUpLoad/(你准备处理的 ActionResult)" method="post" enctype="multipart/form-data"> <input type="file" i

  • ASP.NET MVC中URL地址传参的两种写法

    一.url地址传参的第一种写法 1.通过mvc中默认的url地址书写格式:控制器/方法名/参数 2.实例:http://localhost:39270/RequestDemo/Index/88,默认参数名为id所以名称为id. 如果使用其他名称,后台是无法读取的会报错 二.url地址传参的第二种写法 1.使用?加参数名=参数值的写法,如果有多个参数使用&来连接 http://localhost:39270/RequestDemo/Index?id=88&name=%E5%BC%A0%E4%

  • ASP.NET MVC使用ActionFilterAttribute实现权限限制的方法(附demo源码下载)

    本文实例讲述了ASP.NET MVC使用ActionFilterAttribute实现权限限制的方法.分享给大家供大家参考,具体如下: ActionFilterAttribute是Action过滤类,该属于会在执行一个action之前先执行.而ActionFilterAttribute是 MVC的一个专门处理action过滤的类.基于这个原理 我们做一个权限限制 例如:如何访问 HomeController  里的test  action using System; using System.C

  • asp.net MVC利用ActionFilterAttribute过滤关键字的方法

    本文实例讲述了asp.net MVC利用ActionFilterAttribute过滤关键字的方法.分享给大家供大家参考,具体如下: 在开发过程中,有时候会对用户输入进行过滤,以便保证平台的安全性.屏蔽的方法有很多种,但是今天我说的这种主要是利用MVC中的ActionFilterAttribute属性来实现.由于MVC天然支持AOP,所以我们这种过滤方式正好利用了MVC的这种特性. 下面请看步骤: 首先,当用户输入自己的名称的时候,带有类似<BR>的内容的时候,由于MVC默认是需要验证内容的,

  • ASP.NET MVC DropDownList数据绑定及使用详解

    一:DropDownList 1.1 DropDownList绑定数据 1.1.1 DropDownList 固定绑定 这种方式适合那些已经固定的数据绑定到DropDownList上. 例 复制代码 代码如下: <asp:DropDownList runat="server" ID="ddlArea" Width="120px" > <asp:Listitem value="0">选择性别</as

  • 详解ASP.NET MVC下的异步Action的定义和执行原理

    Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法.如果我们需要定义异步Action方法,必须继承抽象类AsyncController.这篇问你讲述两种不同的异步Action的定义方法和底层执行原理. 一.基于线程池的请求处理 ASP.NET通过线程池的机制处理并发的HTTP请求.一个Web应用内部维护着一个线程池,当探测到抵达的针对本应用的请求时,会从池

  • ASP.NET MVC:Filter和Action的执行介绍

    根据controller的名字正确的实例化了一个controller对象.回到MVCHandler的BeginProcessRequest方法,可以看到,当得到controller对象之后,首先判断它是不是IAsyncController,如果是则会创建委托用来异步执行.通常情况下,我们都是继承自Controller类,这不是一个IAsyncController,于是会直接执行Controller的Execute方法.Execute方法是在Controller的基类ControllerBase中

随机推荐