在 ASP.NET Core 中使用 SignalR
https://weblogs.asp.net/ricardoperes/signalr-in-asp-net-core
作者:Ricardo Peres
译者:oopsguy.com
介绍
SignalR 是一个用于实现实时功能的 Microsoft .NET 库。它使用了多种技术来实现服务器与客户端间的双向通信,服务器可以随时将消息推送到连接的客户端。
现在你可以在 ASP.NET Core 预发行版本中体验它(译者:根据原文的发布时间)。我已经介绍过几次 SignalR 了。
安装
你将需要安装 Microsoft.AspNetCore.SignalR.Client 和 Microsoft.AspNetCore.SignalR 这两个 Nuget 预发行包。此外,你还需要 NPM(Node 包管理器)。安装 NPM 后,你需要获取 @aspnet/signalr-client 包,之后再从 node_modules@aspnet\signalr-client\dist\browser 文件夹中获取 signalr-client-1.0.0-alpha1-final.js 文件(版本可能不同),并将其放置在 wwwroot 文件夹下,以便可以从页面引用到它。
在使用前,我们需要在 ConfigureServices 中注册必须的服务:
services.AddSignalR();
我们将实现一个简单的聊天客户端,因此要在 Configure 方法中注册一个 ChatHub:
app.UseSignalR(routes =>
{
routes.MapHub<ChatHub>("chat");
});
注意:UseSignalR 必须在 UseMvc 之前调用!
如果你有不同的端点,可以为每个 hub 执行此操作。
在视图或布局文件中,添加对 signalr-client-1.0.0-alpha1-final.js 文件的引用:
<script src="libs/signalr-client/signalr-client-1.0.0-alpha1-final.js"></script>
实现 Hub
该 hub 是一个继承了 Hub 的类。你可在其中添加 JavaScript 可能用到的方法。我们将实现一个 chat hub:
public class ChatHub : Hub
{
public async Task Send(string message)
{
await this.Clients.All.InvokeAsync("Send", message);
}
}
如上所述,我们有一个方法(Send),在本例中,它采用了单参数(message)。你不需要在广播调用(InvokeAsync)上传递相同的参数,可以发送任何你想要传递的参数。
回到客户端部分,在引用 SignalR JavaScript 文件后添加如下代码:
<script>
var transportType = signalR.TransportType.WebSockets;
//can also be ServerSentEvents or LongPolling
var logger = new signalR.ConsoleLogger(signalR.LogLevel.Information);
var chatHub = new signalR.HttpConnection(`http://${document.location.host}/chat`, { transport: transportType, logger: logger });
var chatConnection = new signalR.HubConnection(chatHub, logger);
chatConnection.onClosed = e => {
console.log('connection closed');
};
chatConnection.on('Send', (message) => {
console.log('received message');
});
chatConnection.start().catch(err => {
console.log('connection error');
});
function send(message) {
chatConnection.invoke('Send', message);
}
</script>
请注意:
- 创建指向当前 URL 的连接后,链接添加了 chat 后缀,这与在 MapHub 中注册的一致
- 它使用特定的传输方式进行初始化(本例中是 WebSockets),但这不是必需的,也就是说,你可以让 SignalR 自己采用合适的方式。对于某些操作系统(如 Windows 7),比如你可能无法使用 WebSockets,因此你必须选择 LongPolling 或 ServerSentEvents
- 需要通过调用 start 来初始化连接
- handler 的 Send 方法与 ChatHub 的 Send 方法有相同的单个参数(message)
所以,每当有人访问此页面并调用 JavaScript send函数时,它将调用 ChatHub 类上的 Send 方法。该类基本上会向所有连接的客户端(Clients.All)广播此消息。也可以将消息发送到特定的组:
await this.Clients.Group("groupName").InvokeAsync("Send", message);
或特定客户端:
await this.Clients.Client("id").InvokeAsync("Send", message);
你如果想启用身份验证,可以添加一个由连接 ID 和 ClaimPrincipal 标识的用户,如下所示:
public override Task OnConnectedAsync()
{
this.Groups.AddAsync(this.Context.ConnectionId, "groupName");
return base.OnConnectedAsync();
}
OnConnectedAsync 在新用户连接时将被调用。当有人断开连接时,OnDisconnectedAsync 将被调用:
public override Task OnDisconnectedAsync(Exception exception)
{
return base.OnDisconnectedAsync(exception);
}
如果在断开连接时发生了异常,则 exception 参数将为非空值。
只有当前用户进行身份验证时, Context 属性才会提供 ConnectionId 和 User 两个属性。ConnectionId 始终被设置为同一个用户,不会改变。
另外,假设你想通过定时器 hub 将定时器 tick 发送到所有连接的客户端,则可以在 Configure 方法中执行此操作:
TimerCallback callback = (x) => {
var hub = serviceProvider.GetService<IHubContext<TimerHub>>();
hub.Clients.All.InvokeAsync("Notify", DateTime.Now);
};
var timer = new Timer(callback);
timer.Change(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(10));
我们启动了一个 Timer,从那里我们得到了一个定时器 hub 的引用,并使用当前时间戳调用其 Notify 方法。TimerHub 类只是这样:
public class TimerHub : Hub
{
}
请注意,此类没有公共方法,因为它不是由 JavaScript 调用,它仅用于从外部广播消息(Timer 回调)。
将消息发送到 Hub
最后,我们还可以将消息从外部发送到 hub。当使用控制器时,你需要注入一个 IHubContext 实例,你可以在里面发送消息到 hub,然后将其广播:
private readonly IHubContext<ChatHub> _context;
[HttpGet("Send/{message}")]
public IActionResult Send(string message)
{
//for everyone
this._context.Clients.All.InvokeAsync("Send", message);
//for a single group
this._context.Clients.Group("groupName").InvokeAsync("Send", message);
//for a single client
this._context.Clients.Client("id").InvokeAsync("Send", message);
return this.Ok();
}
需要注意的是,这与访问 ChatHub 类不同,实现起来并不简单,你需要使用 chat hub 的连接才行。
结论
SignalR 尚未发布,仍可能会有一些变化。在以后的文章中,我将更详细地介绍 SignalR,包括其可扩展性机制和一些更高级的使用场景。敬请期待!
在 ASP.NET Core 中使用 SignalR的更多相关文章
- asp.net core 中的SignalR与web前端进行实时通信
一.介绍 SignalR是.net 开源库,用于构建需要实时进行用户交互和数据更新的web应用,如在线聊天,游戏,天气等实时应用程序,且简化了构建实时应用的过程,包括服务端库和js端库,继承了数种常见 ...
- 一、在 ASP.NET Core 中使用 SignalR
一.介绍 SignalR 是一个用于实现实时网站的 Microsoft .NET 库.它使用多种技术来实现服务器与客户端间的双向通信,服务器可以随时将消息推送到连接的客户端. https://docs ...
- 二、在 ASP.NET Core 中使用 SignalR之类库
一.前段代码: @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="view ...
- 在ASP.NET Core下使用SignalR技术
一.前言 上次我们讲到过如何在ASP.NET Core中使用WebSocket,没有阅读过的朋友请参考 WebSocket in ASP.NET Core 文章 .这次的主角是SignalR它为我们提 ...
- ASP.NET Core 中的实时框架 SingalR
目录 SignalR 是什么? 在 ASP.NET Core 中使用 SignalR 权限验证 横向扩展 源代码 参考 SignalR 是什么? ASP.NET Core SignalR 是一个开源的 ...
- Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)
目录 SignalR系列目录(注意,是ASP.NET的目录.不是Core的) 前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于Signal ...
- ASP.NET Core 2.0 SignalR 示例
# 一.前言 上次讲SignalR还是在<[在ASP.NET Core下使用SignalR技术](http://dotnet.ren/2017/02/21/%E5%9C%A8ASP-NET-Co ...
- 玩转ASP.NET Core中的日志组件
简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...
- 在Asp.net Core中使用中间件来管理websocket
介绍 ASP.NET Core SignalR是一个有用的库,可以简化Web应用程序中实时通信的管理.但是,我宁愿使用WebSockets,因为我想要更灵活,并且与任何WebSocket客户端兼容. ...
随机推荐
- 用Beautifulsoup 来爬取贴吧图片
import urllib.request import bs4 import re import os url="https://tieba.baidu.com/p/1988291937? ...
- bootStrap事例代码
最近在学bootStrap,在慕课网中有这么一个例子-.感觉以后会用到这些代码.保存起来. <!DOCTYPE html> <html lang="zh-cn"& ...
- Intellij IDEA WEB结构目录说明【转载】
https://my.oschina.net/lujianing/blog/186737?p=1#OSC_h2_1
- geotrellis使用(三十四)矢量瓦片技术研究——矢栅一体化
前言 本文所涉及技术与Geotrellis并无太大关系,仅是矢量瓦片前端渲染和加载技术,但是其实我这是在为Geotrellis的矢量瓦片做铺垫.很多人可能会说,Geotrellis为什么要搞矢量瓦片, ...
- zookeeper环境搭建及使用
本文只讲解搭建步骤,先不讲原理相关知识 一.zookeeper下载地址 本文使用版本为zookeeper-3.4.10.tar.gz 地址:http://mirrors.shuosc.org/apac ...
- oracle 常用函数汇总
一.字符函数字符函数是oracle中最常用的函数,我们来看看有哪些字符函数:lower(char):将字符串转化为小写的格式.upper(char):将字符串转化为大写的格式.length(char) ...
- 网站如何集成百度UEditor编辑器
在平时的网站维护使用过程中,富文本编辑器是网站必不可少的元素之一.现在市面上各种编辑器功能设计参差不齐,自己做了几个网站都是用蝉知建站系统做的,而蝉知默认内置的编辑器是KindEditor,功能简单, ...
- Visual Studio + Qt开发环境搭建
1. 安装Visual Studio 2015 Visual Studio 2015下载地址如下,安装比较常规,不做介绍. Visual Studio Enterprise 2015 with Upd ...
- java集合系列——List集合之Vector介绍(四)
1. Vector的简介 JDK1.7.0_79版本 Vector 类可以实现可增长的对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.但是,Vector 的大小可以根据需要增大或缩小,以适 ...
- EXTENDED LIGHTS OUT poj1222 高斯消元法
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6443 Accepted: 42 ...