文档目录javascript
本节内容:html
使用Abp.Web.SignalR nuget包,使基于应用的ABP使用SignalR很是容易,查看SignalR文档了解SignalR的明细信息。web
在你的项目(一般是你的Web层)里安装Abp.Web.SignalR nuget包并在你的模块上添加对它的依赖:asp.net
[DependsOn(typeof(AbpWebSignalRModule))] public class YourProjectWebModule : AbpModule { //... }
而后和你一直作的那样,在你的启动类里使用MapSignalR方法:async
[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项目里安装它(查看SignalR 文档获取更多信息)。ide
页面中应该包含abp.signalr.js,该文件包含在Abp.Web.Resources包里(启动模板中已安装),咱们应该在signalr.hubs以后引入它:
<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.autoConnect设置为true,当客户端链接中断,ABP也会自动从新链接服务器(从客户端)。
当客户端链接到服务端时,会触发全局事件“abp.signalr.connected”,你能够注册这个事件,当链接成功确立时,能够执行你本身的行为。查看事件总线文档获取更多关于客户端事件的信息。
你能够在项目里使用SignalR的所有功能,另外,Abp.Web.SignalR包实现了一些内置的功能。
Abp.Web.SignalR包实现了IRealTimeNotifier来发送实时的通知给客户端(查看通知系统),所以,你的用户能够收到实时的通知推送。
ABP提供了IOnlineClientManager来获取关于在线用户的信息(注入IOnlineClientManager,而后使用GetByUerIdOrNull,GetAllClients,IsOnline方法),IOnlineClientManager须要一个通讯设施才能正常工做,Abp.Web.SignalR包提供了这个设施,因此你能够在应用的任何层里注入,而后使用IOnlineClientManager(若是已经安装SignalR)。
Abp.Web.SignalR包在序列化里用CamelCasePropertyNamesContractResolver重写了SignalR的默认的ContractResolver,所以,在服务端咱们可使用类的帕斯卡方式命名的方法而在客户端可使用驼峰式命名的方法(由于驼峰式在javascript里更原生)来发送/接收对象,若是你想为你程序集里的某些类忽略这点,你能够把这些类添加到AbpSignalRContractResolver.IgnoredAssemblies列表里。
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到依赖注入系统里(根据你的须要,能够把它变成单例),咱们以属性注入模式注入会话和日志记录器。
SendMessage是一个咱们hub的方法,可被客户端使用,咱们在这个方法里,调用全部客户的getMessage函数,如上所示,咱们可使用AbpSession获取当前用户id(若是用户已登陆)。咱们重写了OnConnected和OnDisConnected,实质上不须要它们,只是为了演示。
下面用客户端Javascript代码使用咱们的hub发送/接收消息:
var chatHub = $.connection.myChatHub; //get a reference to the hub chatHub.client.getMessage = function (message) { //register for incoming messages console.log('received message: ' + message); }; abp.event.on('abp.signalr.connected', function() { //register for connect event chatHub.server.sendMessage("Hi everybody, I'm connected to the chat!"); //send a message to the server });
这样咱们就能够在任何须要的时候使用chatHub发送消息给服务端,查看 SignalR 文档 获取更多有关Signal信息。
kid1412附:英文原文:http://www.aspnetboilerplate.com/Pages/Documents/SignalR-Integration