zoukankan      html  css  js  c++  java
  • ABP官方文档翻译 8.2 SignalR集成

    SignalR集成

    介绍

      ABP中的Abp.Web.SignalR nuget包使的使用SignalR变得极其容易。参见SignalR文档了解关于SignalR更多的详细信息。

    安装

    服务器端

      在工程中(通常在web层)安装Abp.Web.SignalR nuget包,并在模块中添加如下依赖:

    [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包,如果以前没有安装的话(参见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.conneted”全局事件。当连接成功建立的时候,你可以注册这个事件来执行操作。参见javascript 事件总线文档了解更多关于客户端事件。

    內建特征

      在应用中你可以使用SignalR的所有功能。另外,Abp.Web.SignalR包实现了一些内建特征。

    通知

      Abp.Web.SignalR包实现了IRealTimeNotifier来给客户端(参见通知系统)发送实时通知。因此,用户可以获得实时推送的通知。

    在线客户端

      ABP提供了IOnlineClientManager来获取关于在线用户的信息(例如,注入IOnlineClientManager并使用GetByUserIdOrNull,GetAllClients,IsOnline方法)。IOnlineClientManager需要一个通讯基础设施才可以使用。Abp.Web.SignalR包提供了基础设施。所以,如果安装了SignalR,你可以在任何层注入并使用IOnlineClientManager.

    PascalCase与CamelCase对比

      Abp.Web.SignalR包重写了SignalR默认的ContractResolver来使用CamelCasePropertyNamesContractResolver进行序列化。因此,在服务端我们的类有PascalCase形式命名的属性,在客户端以camelCase的形式使用它们来发送/接收对象(因为在javascript中camelCase是首选的记法)。如果你想在一些程序集中的类忽略这个,那么你可以将这些程序集添加到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到依赖注入系统(你可以基于需求将它设计为单例)。我们通过属性注入了sesson和logger。

      SendMessage是我们hub的一个方法,可以被客户端使用。在这个方法中我们调用所有客户端的getMessage函数。如你所见,我们可以使用AbpSession获取当前用户id(如果用户已经登录)。我们也重写了OnConnectedOnDisconnected,这仅仅是为了示范用法,实际上在这里并不需要。

      这里,客户端的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文档了解更多SignalR的详细信息。

    返回主目录

  • 相关阅读:
    about_并查集
    MST_prim
    MST_kruskal
    物联网的未来:关于物联网的10个预测
    如何展现云计算安全领导力
    虚拟机发展依然强劲,但会被容器取代吗?
    如何从人工智能部署中获取最大价值
    维特根斯坦:为何夸大人工智能是对人性的贬损?
    区块链技术还在不断创新
    区块链真正能用来干什么?这5件事说清楚了
  • 原文地址:https://www.cnblogs.com/xajh/p/7143456.html
Copyright © 2011-2022 走看看