返回总目录


本篇目录

介绍###

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文档

ABP理论学习之SignalR集成的更多相关文章

  1. ABP文档 - SignalR 集成

    文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...

  2. ABP理论学习之NHibernate集成

    返回总目录 本篇目录 Nuget包 配置 实体映射 仓储 仓储基类 实现仓储 自定义仓储方法 阅读其他 ABP可以使用任何ORM框架工作,并且已经内置了NHibernate集成.这篇文章会解释如何在A ...

  3. ABP理论学习之EntityFramework集成

    返回总目录 本篇目录 Nuget包 创建DbContext 仓储 仓储基类 实现仓储 自定义仓储方法 阅读其他 ABP可以使用任何ORM框架工作,并且已经内置了EntityFramework集成.这篇 ...

  4. ABP理论学习之OWIN集成

    返回总目录 如果你的应用中使用了OWIN,那么需要在主项目(一般来说是指Web项目)中添加Abp.Owin的nuget包,然后像下面那样在OWIN的 Startup文件中调用 UseAbp()扩展方法 ...

  5. ABP理论学习之OData集成(新增)

    返回总目录 本篇目录 介绍 安装 创建控制器 例子 样例项目 介绍 OData在其官网的定义是: 允许以一种 简单且标准的方式创建和使用可查询的.可互操作的RESTful APIs. 在ABP中也可以 ...

  6. ABP官方文档翻译 8.2 SignalR集成

    SignalR集成 介绍 安装 服务器端 客户端 建立连接 內建特征 通知 在线客户端 PascalCase与CamelCase对比 你的SignalR代码 介绍 ABP中的Abp.Web.Signa ...

  7. ABP理论学习之发布说明

    返回总目录 查看更详细信息以及下载源代码请查看原文档 ABP v0.9.2.0 | [更新日期:2016/6/6 11:21:28 ] 解决方案转换成xproj/project.json格式. 添加了 ...

  8. ABP理论学习之Web API控制器(新增)

    返回总目录 本篇目录 介绍 AbpApiController基类 本地化 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器 ...

  9. ABP理论学习之Javascript API(理论完结篇)

    返回总目录 本篇目录 Ajax Notification Message UI block和busy 事件总线 Logging 其他工具功能 说在前面的话 不知不觉,我们送走了2015,同时迎来了20 ...

随机推荐

  1. zTree和SweetAlert插件初探

    1.zTree插件简介 zTree是一个依靠 jQuery实现的多功能“树插件”.优异的性能.灵活的配置.多种功能的组合是zTree最大优点.专门适合项目开发,尤其是树状菜单.树状数据的Web显示.权 ...

  2. 【NodeJS】环境变量配置

    安装完Node后,NodeJS自带npm.于是我照着网上的教程想搭一个脚手架.结果报错: ’node’ 不是内部或外部命令,也不是可运行的程序 但是我检查了一下系统环境变量,path底下有正确引用no ...

  3. direct path read

    在11g中,全表扫描可能使用direct path read方式,绕过buffer cache,这样的全表扫描就是物理读了. 在10g中,都是通过gc buffer来读的,所以不存在direct pa ...

  4. 一个年轻的码农的一个C#项目

    话不多少,今天要写一个小项目.我们写项目要做好准备.我们要做项目分析.要知道用户需求,然后在根据需求来规划自己的项目.我们要用自己所学,做最好的程序.尽自己所能完成项目需求.精简代码! 我们今天要写的 ...

  5. racket

    let 和 let* 区别 ``` racket // 这是对的 (let* ([x (random 4)][o (random 4)] [diff (number->string (abs ( ...

  6. mybatis多表查询

    1.在类的属性里定义另一个关联类,在mapper.xml里写result-mapper加association 2.表很多的话,可以在数据库里建视图view,把不同表里需要的字段写到一张视图里 写po ...

  7. ViewPager+Fragment取消预加载(延迟加载)(转)

    原文:http://www.2cto.com/kf/201501/368954.html 在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragmen ...

  8. 向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)[上拉加载组件]

    /**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...

  9. 时代杂志发文:2017 AR/MR将变得比VR更加重要

    每到年末都有很多企业或高管分析科技产业明年趋势.近日,时代杂志网页版刊登了2017年科技行业的五大趋势和热点话题的预测.该本作者TimBajarin,是硅谷市场研究公司CreativeStrategi ...

  10. IIS ISAPI

    cscript.exe %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 ...