SignalR 集成(AspNet Core)

介绍

该  Abp.AspNetCore.SignalR  NuGet包使得它更容易在基于样板的ASP.NET应用程序中使用ASP.NET核心SignalR。

注意:此包目前处于预览状态。如果您遇到问题,请写信给GitHub问题:https://github.com/aspnetboilerplate/aspnetboilerplate/issues/new

安装

服务器端

Abp.AspNetCore.SignalR  NuGet包安装  到您的项目(通常是您的Web层)并为您的模块添加依赖性:

[DependsOn(typeof(AbpAspNetCoreSignalRModule))]
public class YourProjectWebModule : AbpModule
{
    //...
}

然后在Startup类中使用AddSignalR和UseSignalR方法:

using Abp.Web.SignalR.Hubs;

namespace MyProject.Web.Startup
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSignalR();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseSignalR(routes =>
            {
                routes.MapHub<AbpCommonHub>("/signalr");
            });
        }
    }
}

客户端(角度)

应该在package.json中添加@ aspnet / signalr包,并在angular.json中的脚本下包含signalr.min.js。

abp.signalr-client.js脚本应包含在angular.json中的资产下。

SignalR无法发送授权标头,因此在查询字符串中发送encryptedAuthToken。启动模板包括SignalRAspNetCoreHelper。我们应该在app.component.ts中的ngOnInit中调用它:

SignalRAspNetCoreHelper.initSignalR();

这就是你要做的一切。SignalR已正确配置并集成到您的项目中。

客户端(jQuery)

应该在页面上包含abp.signalr-client.js脚本。它位于  Abp.Web.Resources  包中(已安装在  启动模板中)。我们应该在signalr.min.js之后包含它:

<script src="~/lib/signalr-client/signalr.min.js"></script>
<script src="~/lib/abp-web-resources/Abp/Framework/scripts/libs/abp.signalr-client.js"></script>

这就是你要做的一切。SignalR已正确配置并集成到您的项目中。

连接建立

当您的页面上包含abp.signalr-client.js时,ASP.NET Boilerplate会自动连接到服务器(来自客户端)。这通常很好。但在某些情况下,您可能不需要它。您可以在包含abp.signalr-client.js之前添加这些行以禁用自动连接:

<script>
    abp.signalr = abp.signalr || {};
    abp.signalr.autoConnect = false;
</script>

在这种情况下,您可以在需要连接到服务器时手动调用abp.signalr.connect()函数。

当客户端断开连接时,ASP.NET Boilerplate还会自动重新连接到服务器(来自客户端),ifabp.signalr.autoConnect为true。

当客户端连接到服务器时,将触发“abp.signalr.connected”全局事件。您可以注册此事件以在成功建立连接时执行操作。 有关客户端事件的更多信息,请参阅JavaScript  事件总线文档

内置功能

您可以在应用程序中使用SignalR的所有功能。此外,Abp.AspNetCore.SignalR包实现了一些内置功能。

通知

Abp.AspNetCore.SignalR包实现IRealTimeNotifier以向客户端发送实时通知(请参阅  通知系统)。这样,您的用户就可以获得实时推送通知!

在线客户

ASP.NET Boilerplate提供IOnlineClientManager以获取有关在线用户的信息(例如,注入IOnlineClientManager并使用GetByUserIdOrNull,GetAllClients,IsOnline方法)。IOnlineClientManager需要通信基础设施才能正常工作。Abp.AspNetCore.SignalRpackage提供此基础结构,因此如果安装了SignalR,您可以在应用程序的任何层中注入和使用IOnlineClientManager。

您的SignalR代码

Abp.AspNetCore.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 async Task SendMessage(string message)
    {
        await Clients.All.SendAsync("getMessage", string.Format("User {0}: {1}", AbpSession.UserId, message));
    }

    public override async Task OnConnectedAsync()
    {
        await base.OnConnectedAsync();
        Logger.Debug("A client connected to MyChatHub: " + Context.ConnectionId);
    }

    public override async Task OnDisconnectedAsync(Exception exception)
    {
        await base.OnDisconnectedAsync(exception);
        Logger.Debug("A client disconnected from MyChatHub: " + Context.ConnectionId);
    }
}
routes.MapHub<MyChatHub>("/signalr-myChatHub"); // Prefix with '/signalr'

我们实现了ITransientDependency接口,只需将我们的集线器注册到  依赖注入系统(您可以根据需要将其设置为单例)。我们  注入  了  会话  和  记录器或者,我们可以继承AbpHubBase。

SendMessage是我们的中心的一种方法,可供客户使用。我们在此方法中调用所有客户端的getMessage函数。我们可以使用  AbpSession  获取当前用户ID(如果用户已登录),如上所述。我们还覆盖OnConnectedAsync和OnDisconnectedAsync,这仅用于演示目的,此处不需要。

以下是使用我们的集线器发送/接收消息的客户端JavaScript代码。

var chatHub = null;

abp.signalr.startConnection('/signalr-myChatHub', function (connection) {
    chatHub = connection; // Save a reference to the hub

    connection.on('getMessage', function (message) { // Register for incoming messages
        console.log('received message: ' + message);
    });
}).then(function (connection) {
    abp.log.debug('Connected to myChatHub server!');
    abp.event.trigger('myChatHub.connected');
});

abp.event.on('myChatHub.connected', function() { // Register for connect event
    chatHub.invoke('sendMessage', "Hi everybody, I'm connected to the chat!"); // Send a message to the server
});

然后,我们可以随时使用chatHub将消息发送到服务器。

nidie.com.cn - 用心与你沟通