文檔目錄
本節內容:
簡介
使用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)。
帕斯卡 vs 駱駝式
Abp.Web.SignalR包在序列化裡用CamelCasePropertyNamesContractResolver重寫了SignalR的默認的ContractResolver,因此,在服務端我們可以使用類的帕斯卡方式命名的方法而在客戶端可以使用駝峰式命名的方法(因為駝峰式在javascript裡更原生)來發送/接收對象,如果你想為你程序集裡的某些類忽略這點,你可以把這些類添加到AbpSignalRContractResolver.IgnoredAssemblies列表裡。
你的SignalR代碼
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