Asp.net SignalR 完成服务端音信推送到Web端

          从前的篇章介绍过Asp.net
SignalR
,  ASP .NET SignalR是一个ASP .NET
下的类库,能够在ASP .NET 的Web项目中落实实时通讯. 
今日大家来促成服务端音信推送到Web端,   首先回看一下它抽象层次图是那般的:

程序猿?NO,是程序员的一天了,而且是大数据程序员,是个了不可的程序员。

资讯 1

 

事实上 Asp.net SignalR 2 已毕 服务端新闻推送到Web端, 尤其不难.
为了赢得更好的可伸缩性, 大家引入信息队列, 看如下基本流程图:

资讯 2

音讯队列MQ监听, 在Web site 服务端一收到音讯,即刻通过Signalr
推送广播到客户端.  创设ASP.NET MVC WEB APP,  从NuGet 安装SignalR 2.12

Install-Package Microsoft.AspNet.SignalR

实际贯彻代码,是那般的,大家伸张一个空的Hub:

    public class FeedHub : Hub

    {

        public void Init()

        {

        }

    }

 

是大致的信息模型, 标题与本文属性:

    [Serializable]

    public class PushMessageModel

    {

        public int Id { get; set; }

        public string MSG_TITLE { get; set; }

        public string MSG_CONTENT { get; set; }

    }

服务端推送具体类,记录日志, 成立新闻队列实例,监听, 等待接受音讯.
那里大家运用的是AcitveMQ的.net客户端.
ActiveMQListenAdapter是一个装进过的对象. 

    public class MQHubsConfig

    {

        private static ILogger log = new Logger("MQHubsConfig");

 

        /// <summary>

        /// Registers the mq listen and hubs.

        /// </summary>

        public static void RegisterMQListenAndHubs()

        {

            var activemq = Megadotnet.MessageMQ.Adapter.ActiveMQListenAdapter<PushMessageModel>.Instance(MQConfig.MQIpAddress, MQConfig.QueueDestination);

            activemq.MQListener += m =>

            {

                log.InfoFormat("从MQ收到消息{0}", m.MSG_CONTENT);

                GlobalHost.ConnectionManager.GetHubContext<FeedHub>().Clients.All.receive(m);

            };

 

            activemq.ReceviceListener<PushMessageModel>();

        }

    }

上面有一句关键代码GlobalHost.ConnectionManager.GetHubContext<FeedHub>().Clients.All.receive(m); 
这里运用了GetHubContext方法后,直接来播音新闻.

需要在MVCApplication下加载:

    public class MvcApplication : System.Web.HttpApplication

    {

        protected void Application_Start()

        {

            AreaRegistration.RegisterAllAreas();

            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

            RouteConfig.RegisterRoutes(RouteTable.Routes);

            BundleConfig.RegisterBundles(BundleTable.Bundles);

            MQHubsConfig.RegisterMQListenAndHubs();

        }

    }

与此同时需要充实一个Starup.cs, 用于Owin

[assembly: OwinStartup(typeof(RealTimeApp.Startup))]

namespace RealTimeApp

{

    public class Startup

    {

        public void Configuration(IAppBuilder app)

        {

            // Any connection or hub wire up and configuration should go here

            app.MapSignalR();

        }

    }

}

接下去是客户端App.js:

function App() {

    var init = function () {

        Feed();

        $.connection.hub.logging = true;

        $.connection.hub.start()

            .done(function() {

                console.log("Connected!");

                $(document).trigger("Connected");

            })

            .fail(function() { console.log("Could not Connect!"); });

    };

 

    init();

};

Feed.js 具体与SignalR.js通讯, 创制名为receive的function, 与服务端对应

function Feed() {

    var chat = undefined;

 

    var init = function () {

    

        // Reference the auto-generated proxy for the hub.

        chat = $.connection.feedHub;

        // Create a function that the hub can call back to display messages.

        chat.client.receive = function (item) {

            var selector = "ul.feed-list li[data-id=" + item.Id + "]";

            if (!($(selector).length > 0)) {

                $("ul.feed-list").prepend($(".feed-template").render(item));

                $("ul.feed-list li:gt(3)").remove();

            }

 

            $.messager.show({

                title: 'Tips',

                msg: item.MSG_CONTENT,

                showType: 'show'          

            });

 

     

        };

 

        // Start the connection.

        $.connection.hub.start().done(function () {

            chat.server.init();

        });

 

    };

 

    init();

};

资讯 3

        上边的javascript代码与服务端有通讯, 具体看如下图:

谦先生日志连载,大数据程序猿的普通幸福生活。

       
资讯 4

 

        在Index.cshtml,  大家要求引用SignalR客户端JS, 放置hubs,
那里大家运用了jsrender,  easyui.js 来显示推送的新闻.

普遍版:

@model dynamic

 

@section Scripts {

<link href="/Content/themes/default/window.css" rel="stylesheet" />

<link href="~/Content/themes/default/progressbar.css" rel="stylesheet" />

<link href="~/Content/themes/default/linkbutton.css" rel="stylesheet" />

<script src="~/Scripts/jquery.signalR-2.1.2.min.js"></script>

<!--Reference the autogenerated SignalR hub script. -->

<script src="~/signalr/hubs"></script>

 

<script src="~/Scripts/jsrender.js"></script>

<script src="~/Scripts/jquery.easyui.min-1.4.1.js"></script>

 

@Scripts.Render("~/Scripts/project.js")

 

    <script type="text/javascript">

        $(document).ready(function () {

            var app = new App();

        });

 

    </script>

}

 

 

<div class="row-fluid">

 

    <div class="span8">

        <div class="widget">

            <div class="widget-header">

                <h2>Feed</h2>

            </div>

            <div class="widget-content">

                <ul class="span12 feed-list"></ul>

            </div>

        </div>

    </div>

</div>

 

<script class="chat-template" type="text/x-jquery-tmpl">

    <li>

        <p>{{>Message}}</p>

    </li>

</script>

 

<script class="feed-template" type="text/x-jquery-tmpl">

    <li data-id="{{>Id}}">

        <div class="row-fluid">

 

            <div class="span8">

                <h3>{{>MSG_CONTENT}}</h3>

            </div>

        </div>

    </li>

</script>

 

上代码服务端引用js的Script.Render, 需求在BundleConfig.cs中参与以下代码:

7:30—8:30

          bundles.Add(new ScriptBundle("~/Scripts/project.js")
              .IncludeDirectory("~/Scripts/Project", "*.js", false));

大多数商店的上班时间都是9:00或者9:30,甚至10:00。而我辈合营社有点奇葩,夏季8:30上班,春季9:00上班。于是大家那帮苦逼们每一日就得睡眼朦胧那样上班去。住得远点或者会堵车的就更惨了。。。

并且我们创设一个WebAPI来发送需求推送的新闻, 片断代码:

 

        /// <summary>

        /// SendMessage

        /// </summary>

        /// <param name="messagemodel">The messagemodel.</param>

        /// <returns></returns>

        [HttpPost]

        public IHttpActionResult SendMessage(PushMessageModel messagemodel)

        {

            return SendToServer(messagemodel);

 

        }

 

        /// <summary>

        /// Sends to server.

        /// </summary>

        /// <param name="messagemodel">The messagemodel.</param>

        /// <returns></returns>

        private IHttpActionResult SendToServer(PushMessageModel messagemodel)

        {

 

            if (ModelState.IsValid)

            {

                if (messageRepository.SendMessage(messagemodel))

                {

                    log.Debug("发送成功!");

                    return Ok();

                }

                else

                {

                    log.ErrorFormat("发送失败!{0}", messagemodel);

                    return Content(HttpStatusCode.ExpectationFailed, new Exception("send message error"));

                }

            }

            else

            {

                log.ErrorFormat("参数验证失败!{0}", messagemodel);

                return Content(HttpStatusCode.BadRequest, ModelState);

            }

 

        }

 

9:00—10:00

出殡音讯到ActiveMQ的基本点代码:

到了铺面,9得要半个钟头或者1个钟头缓冲下,冲下浪看下音讯,然后就回味下方才还在床上的那种痛感——最高境界的走神还有瞌睡。。。

    public class MessageRepository:IMessageRepository

    {

        private static ILogger log = new Logger("MessageRepository");

 

        /// <summary>

        /// 发送消息

        /// </summary>

        /// <param name="messagemodel"></param>

        /// <returns></returns>

        public bool SendMessage(PushMessageModel messagemodel)

        {

          var activemq = new ActiveMQAdapter<PushMessageModel>(MQConfig.MQIpAddress, MQConfig.QueueDestination);

          return activemq.SendMessage<PushMessageModel>(messagemodel)>0;

        }

    }

 

 

10:00—11:00

倘若您必要周转DEMO程序,必要打造基于ActiveMQ的信息队列,  
运行效果是那般的, 大家在一个静态html中, 发送一个ajax到webapi服务端, 
发送后

那般就到了10左右了,那时候就很清晰了,去看一下信箱有没有没看过的邮件或者新职分,发轫去干自己前天要干得仍旧昨日从未干完的活。

资讯 5

 

另一个website网站收到后, 列表更新, 并在右下角弹出框

11:00—12:00

资讯 6

到了大多11点,发现自己还尚未叫外卖,于是就想前些天吃什么样,叫外卖照旧出去吃啊。纠结了十多分钟后11点多短时间订好外卖了,又再持续磨磨蹭蹭地做手上的工作。

IE的主宰台出口:

 

HTML1300: Navigation occurred.
File: Index
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Client subscribed
to hub ‘feedhub’.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Negotiating with
‘/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%7B%22name%22%3A%22feedhub%22%7D%5D’.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: This browser
doesn’t support SSE.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Binding to iframe’s
load event.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Iframe transport
started.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: foreverFrame
transport selected. Initiating start request.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: The start request
succeeded. Transitioning to the connected state.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Now monitoring keep
alive with a warning timeout of 13333.333333333332 and a connection lost
timeout of 20000.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Invoking
feedhub.Init
Connected!
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Invoked
feedhub.Init
[11:07:12 GMT+0800 (China Standard Time)] SignalR: Triggering client
hub event ‘receive’ on hub ‘FeedHub’.
[11:07:18 GMT+0800 (China Standard Time)] SignalR: Triggering client
hub event ‘receive’ on hub ‘FeedHub’.
[11:07:32 GMT+0800 (China Standard Time)] SignalR: Triggering client
hub event ‘receive’ on hub ‘FeedHub’.
[11:07:51 GMT+0800 (China Standard Time)] SignalR: Triggering client
hub event ‘receive’ on hub ‘FeedHub’.
[11:09:25 GMT+0800 (China Standard Time)] SignalR: Triggering client
hub event ‘receive’ on hub ‘FeedHub’
.

12:00—13:00

地点粗体是 最终大家发的第5条音讯控制台的输出.

正午就开辟个摄像,女程序员的话一般都是看剧或者综艺节目,男程序员的话一般就是刷下天涯论坛、技术博客、AB站、什么都有。。。我是逛YouTube和刷各个技能贴哈哈^
^

 

 

好了,到这时, 由于篇幅有限, 示例代码没有任何显得,
能够在那时候下载
须求设置ActiveMQ

13:00—15:00

 

那几个时间基本都选择小睡个午觉了,到13:30又被迫醒来,没睡够的或者没睡的又连续丢了魂似的迷迷糊糊了1个钟头

可望对你支付实时Web App有扶助.

 

你也许感兴趣的作品:

15:00—18:00

SignalR介绍与Asp.net

大多15:00,人又焕发起来工作了。到直到17:00集中力卓越高,接下去工作就更加磨蹭,磨到18:00下班的时候了,没干完前日随即干,但明日要交的话,又得白白加班了。。。。

如有想打听更加多软件,系统 IT,集团音讯化 资讯,请关心自我的微信订阅号:

 

资讯 7

18:00——03:00

作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
正文版权归作者和和讯共有,欢迎转发,但未经作者同意必须保留此段声明,且在篇章页面分明地方给出原文连接,否则保留追究法律义务的义务。
该小说也还要发布在自己的单身博客中-Petter Liu
Blog

夜晚,准时下班的同志们就多少人来句游戏或者联合玩个网游什么的呢,又或者是看电视剧。无法按时下班的话,祈祷程序没错。。。对人生绝望了。。。早晨无数刷微信新浪朋友圈

 

 

资讯 8

 

 

上进版:

6:45 8:30

每一天早早就兴起,生怕会迟到,总记住守时是做人最要紧的口径。在半路会刷一下技巧贴跟周边技术情报。

 

 

8:30—9:00

自我批评邮箱,准备好前日要做到的作业,揣测工作的达成时间,想转手以来大概的做事任务

 

 

9:00—12:00

进去中度集中的劳作状态,一切按进程进行。

 

 

12:00—13:00

花十多分钟吃完早晨已经订好(今天中午早已想好吃什么)的外卖,浏览各大技术博客,逛逛YouTube,刷下新浪刷下非死不可贴,还有写写自己的技能博客。

 

 

13:00—13:30

小睡一觉,很快就睡着了。

 

 

13:30—14:00

看一下邮件,审视下那天的工作进程,准备进入工作情状

 

 

14:00—17:30

高度集中地投入工作

 

 

17:30—18:00

重整好当天的劳作资料,审视今日 的工作进度和作用,查看邮箱

 

 

18:00——03:00

按布置学习进程学习新的技术,精通公司连带的政工与技能。有时候去磨炼下

 

 

资讯 9

 

 

程序员的一周

 

周五,完毕多少个需要过一天, 感觉吗也没干似的

周三,要干得事情多着的觉得

星期四,好专注的干活

星期二,后天又周最后,时间过得也是挺快的,越来越磨蹭,老是逛网站

星期五,早晨在写周总计报告,继续逛网站,清晨再该周总括报告,抽根烟,等下班。。。。

周六天玩游戏、看电影,mm的话照旧逛街,看剧看综艺节目。。。

 

 

程序员的三月

 

15号发工钱,前几天礼拜日10多少个须求后到星期一一周了(22号)。。。还有四周,再10多少个七日了(1号),再撑七日(8号)。。。上周将要发工钱了(15号)
/(ㄒoㄒ)/ 。。。。。循环ING,薪水是迷信。。。

 

 资讯 10

 

 

程序员的一年

 

大年终一沐日……

新春佳节假日……(拿一遍薪俸后)

明朗假期……(拿几遍薪资后)

五一沐日……(拿三回薪水后)

元宵沐日……(准备拿三回薪金时)

中秋沐日……(拿3次薪水后,最漫长的等候资讯,~ 可以用年假去撑过)

国庆假期……(拿三回薪水后)

年会……又元朔……(拿2次薪酬后)

 

 资讯 11

 

 

关于年底奖(一般一个月薪,未满年按比例分发,13薪的话就年终奖加年终双薪,15薪的话就季度绩效,16薪的话就可能一年一发或者季度绩效)就看公司了,RP好的磕碰有良知的合作社年终就有年底奖了,RP差不多的话,年初奖会拖到前年5月竟是2月。。。

 

脚下本身很少写开发代码了,写java代码的火候不多,紧如若写Shell、Python 和
Hive Query Language ,偶尔写Scala。

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注