Asp net SignalR 实现服务端消息推送到Web端.docx
ASignalR实现服务端消息推送到Web端
之前的文章介绍过ASignalR,ASP.NETSignalR是一个ASP.NET下的类库,可以在ASP.NET的Web项目中实现实时通信.今天我们来实现服务端消息推送到Web端,首先回顾一下它抽象层次图是这样的:
实际上ASignalR2实现服务端消息推送到Web端,更加简单.为了获取更好的可伸缩性,我们引入消息队列,看如下基本流程图:
消息队列MQ监听,在Website服务端一收到消息,马上通过Signalr推送广播到客户端.创建ASP.NETMVCWEBAPP,从NuGet安装SignalR2.12
Install-PackageMicrosoft.AspNet.SignalR
具体实现代码,是这样的,我们增加一个空的Hub:
publicclass
publicclassFeedHub:Hub
{
publicvoidInit()
{
}
}
是简单的消息模型,标题与正文属性:
publicintId
{get;set;
}
publicstring
MSG_TITLE{
get;set;
}
[Serializable]publicclassPushMessageModel{publicstringMSG_CONTENT{get;set;}}服务端推送具体类,记录日志,创建消息队列实例,监听,等待收取消息.
[Serializable]
publicclassPushMessageModel
{
publicstringMSG_CONTENT{get;set;}
}
ActiveMQListenAdapter是一个封装过的对象.
publicclass
publicclassMQHubsConfig
{
privatestaticILoggerlog=newLogger(MQHubsConfig);
///summary
///Registersthemqlistenandhubs.
///Registersthemqlistenandhubs.
////summary
publicstaticvoidRegisterMQListenAndHubs()
{
varactivemq=
Megadotnet.MessageMQ.Adapter.ActiveMQListenAdapterPushMessage
Model.Instance(MQConfig.MQIpAddress,
MQConfig.QueueDestination);
activemq.MQListener+=m=
{
log.InfoFormat(从MQ收到消息{0},m.MSG_CONTENT);
GlobalHost.ConnectionManager.GetHubContextFeedHub().Clients.
All.receive(m);
};
activemq.ReceviceListenerPushMessageModel();
}
}
上面有一句关键代码
GlobalHost.ConnectionManager.GetHubContextFeedHub()
.Clients.All.receive(m); 这里使用了GetHubContext方法后,直接来广播消息.
需要在MVCApplication下加载:
publicclass
publicclassMvcApplication:System.Web.HttpApplication
{
protectedvoidApplication_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
MQHubsConfig.RegisterMQListenAndHubs();
}
}
同时需要增加一个Starup.cs,用于Owin
[assembly:OwinStartup(
[assembly:OwinStartup(typeof(RealTimeApp.Startup))]
namespaceRealTimeApp
{
publicclassStartup
{
publicv