源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-04-20 06:18 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:使用ASP.NET MVC 4 Async Action+jQuery实现消息通知机制的实现代码
这两天在使用Asp.net MVC 4开发COMET消息通知机制,在后端使用异步线程对消息进行订阅,客户端通过AJAX长连接请求MVC中的ACTION,如:http://localhost/event/imageSet,即表示获取ImageSet对象的变更消息(新增,更新和删除消息)。 1.事件消息的类IEventEntity<TEntity>类的定义
[u]复制代码[/u] 代码如下:
public interface IEntityEvent<TEntity>     {         //变更的实体类对象         TEntity[] Entities         {             get;         }         //操作类型         EntityEventType Type         {             get;         }     }     public enum EntityEventType : int     {         Create = 0,         Update = 1,         Removed = 2     }
2.EntityEventController类
[u]复制代码[/u] 代码如下:
[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客户端代码
[u]复制代码[/u] 代码如下:
$(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)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部