使用 SignalR與SSE(Sever sent event)向客戶端推送提示信息

最近有個項目想把c/s的代碼轉(zhuǎn)成mvc的坑雅,這聽起來并不困難。
如果UI和業(yè)務(wù)邏輯良好分離了的話衬横,不會花太多的功夫裹粤,應(yīng)該多數(shù)的內(nèi)容都能重復(fù)利用。

但在實際的操作過程中冕香,發(fā)現(xiàn)業(yè)務(wù)邏輯代碼和UI提示全是混在一起的蛹尝,尤其里面有這樣的代碼很多:

public class MyLogic
{
    public int DoPress(string bin)
    {
        if (string.IsNullOrEmpty(bin))
        {
            System.Windows.Forms.MessageBox.Show("數(shù)據(jù)為空,請登錄后使用");
            return -1;
        }

        return 0;
    }
}

這是一段偽代碼悉尾,不是真實的代碼內(nèi)容突那。這段代碼背后有這樣的信息:

  • MyLogic類是底層的代碼,有很多系統(tǒng)都在調(diào)用它构眯,關(guān)系錯綜復(fù)雜
  • 代碼內(nèi)需要有合法性的檢驗愕难,如果合法性校驗失敗,那函數(shù)會被return惫霸,錯誤信息需要讓用戶看到

現(xiàn)在的問題是猫缭,這個MessageBox.Show()的內(nèi)容我怎么才能顯示用戶這一端來呢?

首先壹店,b/s的程序猜丹,這些代碼是運(yùn)行在服務(wù)器端的,原來的MessageBox.Show()不會有任何的效果硅卢。

如果我們修改原先的函數(shù)簽名射窒,將 數(shù)據(jù)為空,請登錄后使用 這句話傳輸?shù)綖g覽器将塑,再用javascript的alert來提示脉顿。技術(shù)上是可以實現(xiàn)的。

就像這樣:

public class MyLogic
{
    public Tuple<int, string> DoPress(string bin)
    {
        if (string.IsNullOrEmpty(bin))
        {
            //System.Windows.Forms.MessageBox.Show("數(shù)據(jù)為空点寥,請登錄后使用");
            return new Tuple<int, string>(-1, "數(shù)據(jù)為空艾疟,請登錄后使用");
        }

        return new Tuple<int, string>(-1, null);
    }
}

這個Tuple會被返回出去,最后傳輸?shù)綖g覽器敢辩。

然而蔽莱,這會修改原先的函數(shù)簽名,所有使用DoPress的函數(shù)都要修改戚长,并且盗冷,有的地方還是使用反射來調(diào)用的,要這樣修改历葛,會帶來巨大的工作量正塌,

根據(jù)這個具體的情況,我不得不去想如何在有限的時間內(nèi)來完成這件事恤溶。

問題的核心是:如何不修改函數(shù)的簽名乓诽,并將相關(guān)的信息輸出到瀏覽器?

我首先浮現(xiàn)了第一個解決方案是SSE(Server sent event)鸠天,它是HTML5里服務(wù)器向客戶端推送事件的一種方式稠集。很快我寫了一個小的demo來進(jìn)行測試饥瓷,確實可以用,但是有問題:非常的慢呢铆,Server產(chǎn)生了消息之后棺克,最長需要等待4秒才能看到提示消息。

我google了這個問題确买,也看到其他人的討論:https://stackoverflow.com/questions/12297740/server-sent-events-work-but-with-a-massive-time-delay

但最后這個問題還是沒有解決。

于是我轉(zhuǎn)向了SignalR湾趾,很快寫了另外的一個demo撑帖,這次工作良好澳眷,消息瞬時到達(dá)钳踊。

那么,之前的項目修改成什么樣子呢拓瞪?

public class MyLogic
{
    public int DoPress(string bin)
    {
        if (string.IsNullOrEmpty(bin))
        {
            MessagePushHelper.PushSignalR("數(shù)據(jù)為空祭埂,請登錄后使用");
            return -1;
        }

        return 0;
    }
}

可以看到兵钮,之前的MessageBox.Show()改成了我自己寫的MessagePushHelper.PushSignalR()舌界,其他位置不變呻拌,這樣應(yīng)該是最小改動的解決方案了。

只不過有一點(diǎn)需要注意的是:要注意多個用戶同時使用時的情況(你不能對外廣播出錯消息)

最后靴拱,簡單的記錄一下步驟:

若要使用SSE

  • 將輸出內(nèi)容標(biāo)記為 text/event-stream
  • 輸出你想要的內(nèi)容

若要使用SignalR

  • nuget包 install-package Microsoft.AspNet.SignalR
  • 創(chuàng)建hub
  • 創(chuàng)建startup類袜炕,打上OwinStartup標(biāo)記
  • 在頁面引用 jquery.signalR-2.2.2.min.js和signalr/hubs
  • 啟動hub并接收數(shù)據(jù)

文中提到的解決方案初家,可在github上查看:https://github.com/syler/Fun/tree/master/SSE-SignalR

我的博客地址:https://1few.com/SSE-SignalR

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笤成,一起剝皮案震驚了整個濱河市炕泳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌培遵,老刑警劉巖籽腕,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皇耗,死亡現(xiàn)場離奇詭異,居然都是意外死亡万伤,警方通過查閱死者的電腦和手機(jī)呜袁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門阶界,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聋庵,“玉大人珍策,你說我怎么就攤上這事宅倒⊥退剩” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵线召,是天一觀的道長缓淹。 經(jīng)常有香客問我塔逃,道長,這世上最難降的妖魔是什么伏蚊? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任躏吊,我火速辦了婚禮帐萎,結(jié)果婚禮上疆导,老公的妹妹穿的比我還像新娘。我一直安慰自己肤舞,他們只是感情好均蜜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布篙顺。 她就那樣靜靜地躺著,像睡著了一般德玫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上材彪,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天段化,我揣著相機(jī)與錄音显熏,去河邊找鬼晒屎。 笑死,一個胖子當(dāng)著我的面吹牛蕴轨,可吹牛的內(nèi)容都是我干的骇吭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碾局!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起净当,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤俘闯,失蹤者是張志新(化名)和其女友劉穎真朗,沒想到半個月后僧诚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝗碎,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年臀防,在試婚紗的時候發(fā)現(xiàn)自己被綠了袱衷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祟昭。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡怖侦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搬葬,到底是詐尸還是另有隱情急凰,我是刑警寧澤猜年,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布抡锈,位于F島的核電站,受9級特大地震影響乔外,放射性物質(zhì)發(fā)生泄漏床三。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一杨幼、第九天 我趴在偏房一處隱蔽的房頂上張望撇簿。 院中可真熱鬧,春花似錦差购、人聲如沸四瘫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽找蜜。三九已至,卻和暖如春稳析,著一層夾襖步出監(jiān)牢的瞬間锹杈,已是汗流浹背撵孤。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闭专,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像廉赔,于是被迫代替她去往敵國和親勿负。 傳聞我的和親對象是個殘疾皇子琅摩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)溉浙,斷路器,智...
    卡卡羅2017閱讀 134,661評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評論 25 707
  • 看多了偶像劇陨献,女孩們大都希望自己是那個被寵愛,多選擇的女一號脖阵,有深情的男一號談情說愛呜呐,癡情的男二號甘心守候,即便人...
    荷葉等雨滴閱讀 352評論 0 2
  • 所在公司的流程 1洋魂、需求評審:產(chǎn)品、開發(fā)角骤、測試背桐、UI等相關(guān)人員參與,需求會提前發(fā)送至郵箱,評審期間提出疑問/建議,...
    吆_慧閱讀 383評論 0 0
  • 一顆沙里看出一個世界 一朵野花里看出一個天堂 把無限抓在你的手掌里 把永恒放進(jìn)一剎那的時光
    Marcsher閱讀 403評論 0 0