使用ASP.NET MVC 4 Async Action+jQuery实现消息通知机制的实现代码
2013-02-26 00:00
916 查看
这两天在使用Asp.net MVC 4开发COMET消息通知机制,在后端使用异步线程对消息进行订阅,客户端通过AJAX长连接请求MVC中的ACTION,如:http://localhost/event/imageSet,即表示获取ImageSet对象的变更消息(新增,更新和删除消息)。
1.事件消息的类IEventEntity<TEntity>类的定义
2.EntityEventController类
(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客户端代码
代码中主要需要控制住在一次获得消息(无论是有消息还是无消息),都需要在恰当的时机现一次的调用getEvent()方法来进行消息获取的循环。
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 MVC 4 Async Action+jQuery实现消息通知机制的实现代码
- [新手上路] [原创]使用ASP.NET MVC 4 Async Action + jQuery 实现消息通知机制
- [新手上路] 使用ASP.NET MVC 4 Async Action + jQuery 实现消息通知机制
- ASP.NET SignaiR 实现消息的即时推送,并使用Push.js实现通知的示例代码
- 记录:asp.net mvc 中 使用 jquery 实现html5 实现placeholder 密码框 提示兼容password IE6
- 在ASP.NET MVC中使用Jquery实现页面局部刷新
- [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果
- asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
- ASP.NET MVC使用jQuery实现Autocomplete
- Asp.Net Mvc 使用jQuery实现Ajax文件上传
- AOP实践--ASP.NET MVC 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁
- ASP.NET MVC 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁
- ASP.NET MVC使用ActionFilterAttribute实现权限限制的方法(附demo源码下载)
- ASP.NET MVC 4使用PagedList.Mvc分页的实现代码
- ASP.NET MVC 计划任务(不使用外接程序,.net内部机制实现)
- asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
- [instant message]用asp.net+ jquery实现comet即时消息机制 ----转载woody.wu
- Asp.net MVC使用JQuery Validate实现用户名重名查询
- [instant message]用asp.net+ jquery实现comet即时消息机制
- asp.net 使用纯jquery上传控件 fineuploader实现多文件上传