使用ASP.NET MVC 4 Async Action+jQuery實(shí)現(xiàn)消息通知機(jī)制的實(shí)現(xiàn)代碼
這兩天在使用Asp.net MVC 4開發(fā)COMET消息通知機(jī)制,在后端使用異步線程對(duì)消息進(jìn)行訂閱,客戶端通過AJAX長(zhǎng)連接請(qǐng)求MVC中的ACTION,如:http://localhost/event/imageSet,即表示獲取ImageSet對(duì)象的變更消息(新增,更新和刪除消息)。
1.事件消息的類IEventEntity<TEntity>類的定義
public interface IEntityEvent<TEntity>
{
//變更的實(shí)體類對(duì)象
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
{
//異步獲取對(duì)ImageSet對(duì)象操作的變更事件Action,millsecondsTimeout為超時(shí)時(shí)間。
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中使現(xiàn)異步asp.net mvc async action(可以參考:Using Asynchronous Methods in ASP.NET MVC 4 技術(shù)文章)的技術(shù),其中方法前的async關(guān)鍵字可以和Task對(duì)象進(jìn)行配合使用,表示該方法為異步方法,由編譯器生成運(yùn)行時(shí)所需的相關(guān)異步操作的邏輯代碼,另外方法中必須使用到await語(yǔ)句來(lái)等待一個(gè)異步操作的結(jié)束,await和Task<T>結(jié)合來(lái)返回Task完成的Result
(2) 如果Controller層面應(yīng)用或者Filter中操作過Session,那么為了避免長(zhǎng)鏈接時(shí)不會(huì)導(dǎo)至同一Session在其他調(diào)用中Session Block的情況,需要在Controller頭上加入[SessionState(SessionStateBehavior.ReadOnly)] 的Attribute,來(lái)表示當(dāng)前Controller對(duì)Session為只讀操作,這樣就其他操作就不會(huì)被阻塞了。
3.這里就不具體寫EntityEventSubscriber消息訂閱器的代碼了,以后將在“消息訂閱與發(fā)布”的文章中詳細(xì)描述。
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: 處理實(shí)體類新增
if(i == data.EntityEvent.Entities.length - 1){
getEvent();
}
});
return;
}
//Update
if(data.EntityEvent.Type == 1){
$.each(data.EntityEvent.Entities, function(i, entity){
//TODO: 處理實(shí)體類更新
if(i == data.EntityEvent.Entities.length - 1){
getEvent();
}
});
return;
}
//Delete
if(data.EntityEvent.Type == 2){
$.each(data.EntityEvent.Entities, function(i, entity){
//TODO: 處理實(shí)體類刪除
if(i == data.EntityEvent.Entities.length - 1){
getEvent();
}
});
}
}else{
$("#imageSets").hoverList("add", data);
getEvent();
}
});
};
getEvent();
});
代碼中主要需要控制住在一次獲得消息(無(wú)論是有消息還是無(wú)消息),都需要在恰當(dāng)?shù)臅r(shí)機(jī)現(xiàn)一次的調(diào)用getEvent()方法來(lái)進(jìn)行消息獲取的循環(huán)。
- JQuery的Alert消息框插件使用介紹
- 基于jQuery的message插件實(shí)現(xiàn)右下角彈出消息框
- jquery插件jquery.confirm彈出確認(rèn)消息
- 基于JQuery 的消息提示框效果代碼
- jquery判斷瀏覽器后退時(shí)候彈出消息的方法
- Notify - 基于jquery的消息通知插件
- jQuery實(shí)現(xiàn)鼠標(biāo)移到元素上動(dòng)態(tài)提示消息框效果
- 基于jQuery的彈出消息插件 DivAlert之旅(一)
- 讓新消息在網(wǎng)頁(yè)標(biāo)題閃爍提示的jQuery代碼
- jquery自定義顯示消息數(shù)量
相關(guān)文章
Asp.net MVC利用knockoutjs實(shí)現(xiàn)登陸并記錄用戶的內(nèi)外網(wǎng)IP及所在城市(推薦)
這篇文章主要介紹了 Asp.net MVC利用knockoutjs實(shí)現(xiàn)登陸并記錄用戶的內(nèi)外網(wǎng)IP及所在城市(推薦),需要的朋友可以參考下2017-02-02
登錄時(shí)記住用戶名和密碼及cookie案例應(yīng)用
本文將實(shí)現(xiàn)登錄時(shí)記住用戶的帳號(hào)密碼,接下來(lái)我們來(lái)模擬一個(gè)登錄介面,要把這個(gè)登錄的信息記錄至Cookie,還要把Cookie的過期時(shí)間設(shè)置7天之后過期,感興趣的朋友可以參考下,希望本文對(duì)你的cookie學(xué)習(xí)有所幫助2013-01-01
顯示非站點(diǎn)目錄及映射網(wǎng)絡(luò)磁盤路徑的圖片
本文就將教你怎樣顯示非站點(diǎn)目錄下的圖片,你可以顯示站點(diǎn)所在服務(wù)器所有驅(qū)動(dòng)器目錄的圖片,以及映射網(wǎng)絡(luò)磁盤路徑的圖片,感興趣的朋友可以了解下就當(dāng)鞏固知識(shí)了或許對(duì)你學(xué)習(xí).net有所幫助2013-02-02
ASP.NET中配合JS實(shí)現(xiàn)頁(yè)面計(jì)時(shí)(定時(shí))自動(dòng)跳轉(zhuǎn)
這篇文章主要介紹了ASP.NET中配合JS實(shí)現(xiàn)頁(yè)面計(jì)時(shí)(定時(shí))自動(dòng)跳轉(zhuǎn),本文主要依靠JS實(shí)現(xiàn)需求,只是在ASP.NET中實(shí)現(xiàn)而已,需要的朋友可以參考下2015-06-06
asp.net得到本機(jī)數(shù)據(jù)庫(kù)實(shí)例的兩種方法代碼
這篇文章介紹了asp.net得到本機(jī)數(shù)據(jù)庫(kù)實(shí)例的兩種方法代碼,有需要的朋友可以參考一下2013-07-07
詳解開源免費(fèi)且穩(wěn)定實(shí)用的.NET PDF打印組件itextSharp(.NET組件介紹之八)
本篇文章主要介紹了.NET PDF打印組件itextSharp。.NET中實(shí)現(xiàn)PDF打印的組件比較多,例如PDFsharp、Report.NET、sharpPDF、itextSharp等等,今天主要簡(jiǎn)單的介紹itextSharp組件。有興趣的可以了解一下。2016-12-12
ASP.NET開發(fā)中經(jīng)常用到10款工具軟件介紹
從事.NET開發(fā)也好幾年了,工作過程中積累一些軟件工具,分享給大家,排名不分先后,希望對(duì)大家有所幫助。2016-04-04
FileUpload1 上傳文件類型驗(yàn)證正則表達(dá)式
FileUpload1 上傳文件類型驗(yàn)證正則表達(dá)式...2006-10-10

