文檔目錄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