返回总目录


本篇目录

介绍###

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. 多Linux系统如何复用/home目录

    Brief: 1./home单独分区:2.不同系统/home建立不同的用户名:3.不同系统/home对其他用户授权 Linux下/home文件夹可以通用吗?例如我机器上同时装了两个Linux系统,可以 ...

  2. Delphi使用ADO进行数据库编程

    Delphi是一个可视化的编程工具,ADO编程也是这样,所以话不多言,直接通过代码.截图和语言来说明. 我的数据库是Oracle,为了测试,先建一个表:create table practice(un ...

  3. ABP中单元测试的技巧:Mock和数据驱动

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:虽然ABP为大家提供了测试的脚手架了,不过有些小技巧还是需要自己探索的. ASP.NE ...

  4. EF不能很好的支持DDD?估计是我们搞错了!

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:最近在ABP项目中尝试纯粹的DDD,然后遇到EF实现的Repository似乎不能很好 ...

  5. angular之上滑换页指令

    healthmallDirectives.directive("goodsTopRefresh", ['$window',function ($window) { return { ...

  6. 学习微信小程序之css9内边距

    padding内边距 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  7. [资料分享]组件方式开发 Web App全站

  8. 第三周作业(三):wc程序

    本程序实现了统计文本档案中,文本单词数.字符数以及行数. 代码如下: #include<stdio.h> #include<stdlib.h> int linestatisti ...

  9. C# winfrom 窗体的StartPosition 属性

    StartPosition属性有如下选项,分别含义如下: CenterParent 窗体在其父窗体中居中. CenterScreen 窗体在当前显示窗口中居中,其尺寸在窗体大小中指定. Manual ...

  10. OpenCV学习笔记(一)——OpenCV3.1.0+VS2015开发环境配置

    摘要: 由于最近AR(增强现实)这个概念非常火爆,各种基于AR的应用及游戏逐渐面向大众,而在AR中最重要的两个技术就是跟踪识别和增强渲染,其中跟踪识别是通过OpenCV这个开源的计算机视觉库来实现的, ...