天天看點

ABP文檔 - SignalR 內建

文檔目錄

本節内容:

  • 簡介
  • 安裝
    • 服務端
    • 用戶端
  • 連接配接确立
  • 内置功能
    • 通知
    • 線上用戶端
    • 帕斯卡 vs 駱峰式
  • 你的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清單裡。

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

kid1412聲明:轉載請把此段聲明完整地置于文章頁面明顯處,并保留個人在部落格園的連結:http://www.cnblogs.com/kid1412/(可點選跳轉)。

繼續閱讀