SignalR 集成

介绍

本文档适用于.NET Framework 4.6.1。如果您对ASP.NET Core感兴趣,请参阅  SignalR AspNetCore Integration  文档。

该  Abp.Web.SignalR  NuGet包可以很容易地在基于样板的ASP.NET应用程序中使用SignalR。有关SignalR 的更多详细信息,请参阅  SignalR文档

安装

服务器端

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

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

然后像往常一样在OWIN启动类中使用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  包中(它已经安装在  启动模板中)。我们应该在信号器集线器之后包含它:

<script src="~/signalr/hubs"></script>
<script src="~/Abp/Framework/scripts/libs/abp.signalr.js"></script>

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

连接建立

当您的页面上包含abp.signalr.js时,ASP.NET Boilerplate会自动连接到服务器(从客户端)。这通常很好,但可能有些情况下你可能不想这样做。您可以在包含abp.signalr.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.Web.SignalR包实现了一些内置功能。

通知

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

在线客户

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

PascalCase与camelCase

Abp.Web.SignalR包重写SignalR的默认ContractResolver以在序列化时使用CamelCasePropertyNamesContractResolver。这样,我们可以在服务器上使用PascalCaseproperties类,并在客户端上使用它们作为camelCase来发送/接收对象(因为camelCase是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,只需通过依赖注入  系统注册我们的集线器  (您可以根据需要将其设置为单例)。我们  注入  了  会话  和  记录器

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

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

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 to connect event
    chatHub.server.sendMessage("Hi everybody, I'm connected to the chat!"); // Send a message to the server
});

然后,我们可以随时使用chatHub向服务器发送消息。有关更多信息,请参阅  SignalR文档

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