使用ASP.NET MVC 4 Async Action+jQuery实现消息通知机制
这两天在使用Asp. 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. 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()方法来进行消息获取的循环。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程