当前位置: 首页 > news >正文

ABP理论学习之SignalR集成

本篇目录

  • 介绍
  • 安装
  • 建立连接
  • 内置功能
  • 你自己的SignaR代码

介绍

Abp.Web.SignalR 使得在基于ABP的应用程序中使用 SignalR相当容易。查看SignalR文档获取更多关于SignalR的详细信息。

安装

服务端

Abp.Web.SignalRnuget包安装到你的项目中(一般是web层),然后给你的模块添加一个依赖:

[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安装到你的web项目中。

客户端

在页面上应该添加abp.signalr.js脚本。它位于Abp.Web.Resources包中(在启动模块中已经安装了)。我们应该在signalr总线之后包含它:

<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.connected”。当该连接成功建立时,你可以注册到该事件以采取相应行动。

内置功能

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

通知

Abp.Web.SignalR包实现了 IRealTimeNotifier来向客户端发送实时通知(查看《通知系统》)。因此,你的用户可以获得实时的推送通知。

在线客户端

ABP提供了IOnlineClientManager来获取关于在线用户的信息(比如,注入IOnlineClientManager然后使用GetByUserIdOrNull, GetAllClients, IsOnline 方法 )。为了能够正确地工作,IOnlineClientManager需要一个通讯基础设施。Abp.Web.SignalR提供了一个这样的基础设施。因此,如果安装了SignalR,那么在应用的任何层都可以注入并使用IOnlineClientManager。

PascalCase vs. camelCase

Abp.Web.SignalR包在序列化时使用CamelCasePropertyNamesContractResolver覆盖了SignalR默认的ContractResolver。因此,我们在服务端的类具有 PascalCase属性,而在客户端作为 camelCase使用来发送/接收对象(因为在javascript中camelCase是更受人喜欢的命名)。如果你想在某些程序集中忽略这个,那么你可以将那些程序集添加AbpSignalRContractResolver.IgnoredAssemblies 列表中。

你自己的SignaR代码

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注册到依赖注入系统中(你可以基于你的需求使它是单例的【singleton】)。我们也使用属性注入了session和logger。

SendMessage是hub的一个方法,它可以被客户端使用。在这个方法中,我们可以调用所有客户端的 getMessage函数。正如你看到的那样,我们可以使用AbpSession来获得当前的用户id(如果用户登录了系统)。为了演示,我们也重写了 OnConnected 和 OnDisconnected,实际这里是不需要的。

这里,客户端的javascript代码使用了我们的集线器hub发送/接收信息。

var chatHub = $.connection.myChatHub; //获取 hub的引用

chatHub.client.getMessage = function (message) { //为即将到来的信息注册
    console.log('received message: ' + message);
};

abp.event.on('abp.signalr.connected', function() { //为连接事件注册
chatHub.server.sendMessage("Hi everybody, I'm connected to the chat!"); //给服务器发送信息
});

然后,无论何时需要向服务器发送信息,我们都可以使用chatHub。这里再提醒一下,想要获取更多关于SignalR的信息,可以点击查看SinalR文档







本文转自tkbSimplest博客园博客,原文链接:http://www.cnblogs.com/farb/p/ABPSignalRIntegration.html,如需转载请自行联系原作者

相关文章:

  • Eclipse Java EE IDE 创建 Dynamic Web project问题
  • 集成第三方接口的技巧总结
  • 开始VS 2012 中LightSwitch系列的第2部分:感受关爱——定义数据关系
  • 在左上角倾斜四十五度显示的TextView
  • java IO类简单介绍
  • 高新集训记录
  • css控制大幻灯绝对居中(非背景)
  • Java synchronized用法
  • Zuul小技巧 /routes
  • flex 与 javascript互调用
  • vue2的keep-alive的总结
  • 一款轻量的图像缩放插件
  • class与dex文件
  • 嵌入式Linux:基于ARM11下Android应用点亮LED灯 【PDF版论文下载】
  • 11.24 静态元素过期时间
  • [case10]使用RSQL实现端到端的动态查询
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【附node操作实例】redis简明入门系列—字符串类型
  • DataBase in Android
  • JS基础之数据类型、对象、原型、原型链、继承
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • overflow: hidden IE7无效
  • Twitter赢在开放,三年创造奇迹
  • vue总结
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 使用common-codec进行md5加密
  • 移动端唤起键盘时取消position:fixed定位
  • 硬币翻转问题,区间操作
  • ionic入门之数据绑定显示-1
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C++17) std算法之执行策略 execution
  • (Note)C++中的继承方式
  • (Python) SOAP Web Service (HTTP POST)
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)hibernate配置管理
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十六)Flask之蓝图
  • (转)Android学习笔记 --- android任务栈和启动模式
  • .bat批处理(一):@echo off
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net 无限分类
  • .NET设计模式(11):组合模式(Composite Pattern)
  • /var/spool/postfix/maildrop 下有大量文件
  • ?php echo ?,?php echo Hello world!;?
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @拔赤:Web前端开发十日谈
  • @我的前任是个极品 微博分析
  • []C/C++读取串口接收到的数据程序
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [4.9福建四校联考]
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [C++核心编程](四):类和对象——封装