本篇目錄
介紹###
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文檔。