ABP文檔 - SignalR 集成


文檔目錄

 

本節內容:

 

簡介

使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM