本节内容:
使用Abp.Web.SignalR nuget包,使基于应用的ABP使用SignalR非常容易,查看SignalR文档了解SignalR的明细信息。
在你的项目(通常是你的Web层)里安装Abp.Web.SignalR nuget包并在你的模块上添加对它的依赖:
[DependsOn(typeof(AbpWebSignalRModule))] public class YourProjectWebModule : AbpModule { //... }
然后和你一直做的那样,在你的启动类里使用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项目里安装它(查看SignalR 文档获取更多信息)。
页面中应该包含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