ABP理论学习之SignalR集成
2016-03-09 23:47
316 查看
返回总目录
安装
建立连接
内置功能
你自己的SignaR代码
然后在你的OWIN Startup类中使用MapSignalR方法:
注意:Abp.Web.SignalR只依赖于Microsoft.AspNet.SignalR.Core包。因此,如果你之前没有安装,那么你也需要将Microsoft.AspNet.SignalR安装到你的web项目中。
就这样,SignalR就配置好了,也就集成到了你的项目中。
这样,当你需要连接到服务器时,你可以手动调用abp.signalr.connect()函数。
当客户端连接到服务器时,会触发全局事件“abp.signalr.connected”。当该连接成功建立时,你可以注册到该事件以采取相应行动。
我们实现了ITransientDependency来简化将我们的集线器hub注册到依赖注入系统中(你可以基于你的需求使它是单例的【singleton】)。我们也使用属性注入了session和logger。
SendMessage是hub的一个方法,它可以被客户端使用。在这个方法中,我们可以调用所有客户端的 getMessage函数。正如你看到的那样,我们可以使用AbpSession来获得当前的用户id(如果用户登录了系统)。为了演示,我们也重写了 OnConnected 和 OnDisconnected,实际这里是不需要的。
这里,客户端的javascript代码使用了我们的集线器hub发送/接收信息。
然后,无论何时需要向服务器发送信息,我们都可以使用chatHub。这里再提醒一下,想要获取更多关于SignalR的信息,可以点击查看SinalR文档。
本篇目录
介绍安装
建立连接
内置功能
你自己的SignaR代码
介绍
Abp.Web.SignalR 使得在基于ABP的应用程序中使用 SignalR相当容易。查看SignalR文档获取更多关于SignalR的详细信息。安装
服务端
将Abp.Web.SignalRnuget包安装到你的项目中(一般是web层),然后给你的模块添加一个依赖:[DependsOn(typeof(AbpWebSignalRModule))] public class YourProjectWebModule : AbpModule { //... }
然后在你的OWIN Startup类中使用MapSignalR方法:
[assembly: OwinStartup(typeof(Startup))] namespace MyProject.Web { public class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR(); //... } } }
注意:Abp.Web.SignalR只依赖于Microsoft.AspNet.SignalR.Core包。因此,如果你之前没有安装,那么你也需要将Microsoft.AspNet.SignalR安装到你的web项目中。
客户端
在页面上应该添加abp.signalr.js脚本。它位于Abp.Web.Resources包中(在启动模块中已经安装了)。我们应该在signalr总线之后包含它:<script src="~/signalr/hubs"></script> <script src="~/Abp/Framework/scripts/libs/abp.signalr.js"></script>
就这样,SignalR就配置好了,也就集成到了你的项目中。
建立连接
当页面上包含abp.signalr.js时,ABP会 自动连接 到服务器(从客户端)。一般来说这很好,但是也可能存在你不想这样的情况。那么你可以在包含 abp.signalr.js之前添加下面的代码来关闭自动连接。<script> abp.signalr = abp.signalr || {}; abp.signalr.autoConnect = false; </script>
这样,当你需要连接到服务器时,你可以手动调用abp.signalr.connect()函数。
当客户端连接到服务器时,会触发全局事件“abp.signalr.connected”。当该连接成功建立时,你可以注册到该事件以采取相应行动。
内置功能
你可以在应用程序中使用SignalR的所有功能,此外,Abp.Web.SignalR包实现了一些内置的功能。通知
Abp.Web.SignalR包实现了 IRealTimeNotifier来向客户端发送实时通知(查看《通知系统》)。因此,你的用户可以获得实时的推送通知。在线客户端
ABP提供了IOnlineClientManager来获取关于在线用户的信息(比如,注入IOnlineClientManager然后使用GetByUserIdOrNull, GetAllClients, IsOnline 方法 )。为了能够正确地工作,IOnlineClientManager需要一个通讯基础设施。Abp.Web.SignalR提供了一个这样的基础设施。因此,如果安装了SignalR,那么在应用的任何层都可以注入并使用IOnlineClientManager。PascalCase vs. camelCase
Abp.Web.SignalR包在序列化时使用CamelCasePropertyNamesContractResolver覆盖了SignalR默认的 ContractResolver。因此,我们在服务端的类具有 PascalCase属性,而在客户端作为 camelCase使用来发送/接收对象(因为在javascript中camelCase是更受人喜欢的命名)。如果你想在某些程序集中忽略这个,那么你可以将那些程序集添加AbpSignalRContractResolver.IgnoredAssemblies 列表中。你自己的SignaR代码
Abp.Web.SignalR 包也简化了你的SignalR代码。假设我们想添加一个集线器(Hub)到应用程序中:public class MyChatHub : Hub, ITransientDependency { public IAbpSession AbpSession { get; set; } public ILogger Logger { get; set; } public MyChatHub() { AbpSession = NullAbpSession.Instance; Logger = NullLogger.Instance; } public void SendMessage(string message) { Clients.All.getMessage(string.Format("User {0}: {1}", AbpSession.UserId, message)); } public async override Task OnConnected() { await base.OnConnected(); Logger.Debug("A client connected to MyChatHub: " + Context.ConnectionId); } public async override Task OnDisconnected(bool stopCalled) { await base.OnDisconnected(stopCalled); Logger.Debug("A client disconnected from MyChatHub: " + Context.ConnectionId); } }
我们实现了ITransientDependency来简化将我们的集线器hub注册到依赖注入系统中(你可以基于你的需求使它是单例的【singleton】)。我们也使用属性注入了session和logger。
SendMessage是hub的一个方法,它可以被客户端使用。在这个方法中,我们可以调用所有客户端的 getMessage函数。正如你看到的那样,我们可以使用AbpSession来获得当前的用户id(如果用户登录了系统)。为了演示,我们也重写了 OnConnected 和 OnDisconnected,实际这里是不需要的。
这里,客户端的javascript代码使用了我们的集线器hub发送/接收信息。
var chatHub = $.connection.myChatHub; //获取 hub的引用 chatHub.client.getMessage = function (message) { //为即将到来的信息注册 console.log('received message: ' + message); }; abp.event.on('abp.signalr.connected', function() { //为连接事件注册 chatHub.server.sendMessage("Hi everybody, I'm connected to the chat!"); //给服务器发送信息 });
然后,无论何时需要向服务器发送信息,我们都可以使用chatHub。这里再提醒一下,想要获取更多关于SignalR的信息,可以点击查看SinalR文档。
相关文章推荐
- 匿名函数与高阶函数的使用
- java二叉树实现、遍历、求深度
- 小代码
- POJ-3687-Labeling Balls-(求最小字典序拓扑序列)逆向建图-拓扑排序
- 幂集合[集合论]
- php 关于时区 date gmdate date_default_timezone_set/get 终极答疑
- 关于域名解析相关的几个记录:DNS A记录 NS记录 MX记录 CNAME记录
- java你可能不知道的事(2)--堆和栈
- Jquery Ajax实现无刷新时返回json数据格式json-default
- Map的三种遍历方法
- android.content.res.Resources$NotFoundException错误处理
- [leetcode 286] Walls and Gates---各个点到门的距离
- java你可能不知道的事(2)--堆和栈
- java你可能不知道的事(2)--堆和栈
- 1048. Find Coins (25)
- 从事web开发方向的一些思考
- Android Studio参数详解
- c++注释
- 【hdu1203】I NEED A OFFER!——01背包
- 学习进度总结随笔