Python语言技术文档

微信小程序技术文档

php语言技术文档

jsp语言技术文档

asp语言技术文档

C#/.NET语言技术文档

html5/css技术文档

javascript

点击排行

您现在的位置:首页 > 技术文档 > MVC/.NET框架

使用ASP.NET_MVC_4_Async_Action+jQuery实现消息通知机制的实现代码

来源:中文源码网    浏览:311 次    日期:2024-04-27 01:02:59
【下载文档:  使用ASP.NET_MVC_4_Async_Action+jQuery实现消息通知机制的实现代码.txt 】


使用ASP.NET MVC 4 Async Action+jQuery实现消息通知机制的实现代码
这两天在使用Asp.net MVC 4开发COMET消息通知机制,在后端使用异步线程对消息进行订阅,客户端通过AJAX长连接请求MVC中的ACTION,如:http://localhost/event/imageSet,即表示获取ImageSet对象的变更消息(新增,更新和删除消息)。
1.事件消息的类IEventEntity类的定义
复制代码 代码如下:public interface IEntityEvent { //变更的实体类对象 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 ImageSet(int millisecondsTimeout = 10000) { return await this.EventAsync(millisecondsTimeout); }
private async Task EventAsync(int millisecondsTimeout) { IEntityEvent entityEvent = await EntityEventSubcriber.Instance.WaitForEntityEvent(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结合来返回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()方法来进行消息获取的循环。

相关内容