博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ABP文档 - SignalR 集成
阅读量:6432 次
发布时间:2019-06-23

本文共 3125 字,大约阅读时间需要 10 分钟。

 

本节内容:

 

简介

使用Abp.Web.SignalR nuget包,使基于应用的ABP使用SignalR非常容易,查看了解SignalR的明细信息。

 

安装

服务端

在你的项目(通常是你的Web层)里安装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包,所以,如果之前还未安装包,你还需要在你的web项目里安装它(查看获取更多信息)。

 

客户端

页面中应该包含abp.signalr.js,该文件包含在Abp.Web.Resources包里(中已安装),我们应该在signalr.hubs之后引入它:

 

就只要这样, SignalR已经配置好且已集成到你的项目里。

 

连接确立

当你的页面包含abp.signalr.js,ABP会自动连接服务器(从客户端),通常情况下,这样很好,但有时你可能不想这样,在引入abp.signalr.js前,你可以添加如下代码禁用自动连接:

 

这种情况里,你可以调用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列表里。

 

你的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到系统里(根据你的需要,可以把它变成单例),我们以模式注入和。

SendMessage是一个我们hub的方法,可被客户端使用,我们在这个方法里,调用所有客户的getMessage函数,如上所示,我们可以使用获取当前用户id(如果用户已登录)。我们重写了OnConnected和OnDisConnected,实质上不需要它们,只是为了演示。

下面用客户端Javascript代码使用我们的hub发送/接收消息:

var chatHub = $.connection.myChatHub; //get a reference to the hubchatHub.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发送消息给服务端,查看  获取更多有关Signal信息。

 

kid1412附:

转载地址:http://dpxga.baihongyu.com/

你可能感兴趣的文章
思科通配符(Cisco Wildcard Mask)
查看>>
PHP cURL快速入门
查看>>
在errpt中报E87EF1BE的解决方法(转载)
查看>>
aix chfs及mklvcopy报错的解决方法
查看>>
取消新增的constraints
查看>>
MAC OS X 使用记录
查看>>
Azure 中使用 iPerf 进行网络带宽测试
查看>>
OPTIMIZE TABLE
查看>>
flask框架+pygal+sqlit3搭建图形化业务数据分析平台
查看>>
Fedora24下MySQL开发环境搭建
查看>>
shell实战训练营Day20
查看>>
jQuery 之 TAB切换菜单
查看>>
mysql 数据库集群搭建:(二)3台CentOS-7安装Percona-XtraDB-Cluster-57集群
查看>>
Jenkins实战演练之Windows系统节点管理
查看>>
MySQL高可用架构之MHA
查看>>
1.8 nginx域名跳转
查看>>
PHP面向对象之接口编程
查看>>
使用 Docker Compose 管理多个容器实例
查看>>
ThinkPHP 删除数据记录 delete 方法
查看>>
Gradle学习笔记(二)--创建Java项目
查看>>