添加Volo.Abp.AspNetCore.SignalRNuGet包到你的项目:
Install-Package Volo.Abp.AspNetCore.SignalR
AbpAspNetCoreSignalRModule
到你的模块的依赖列表在你的HOST项目或者Web项目的Module中添加对应地依赖
[DependsOn(
typeof(AbpAspNetCoreSignalRModule) //Add the new module dependency
)]
public class YourModule : AbpModule
{
}
public class UserHub : AbpHub
{
private const string method = "ReceiveMessage";//客户端接受信息的方法
#region 连接和断开
///
/// 连接
///
///
public override async Task OnConnectedAsync()
{
Logger.LogInformation($"UserHubConnected:tenantId:{CurrentTenant.Id},UserId{_myCurrentUser.Id?.ToString()}{_myCurrentUser.UserName}Connected SignalR");
await base.OnConnectedAsync();
}
///
/// 断开连接
///
///
///
public override async Task OnDisconnectedAsync(Exception exception)
{
Logger.LogInformation($"UserHubDisconnected:tenantId:{CurrentTenant.Id},UserId{_myCurrentUser.Id?.ToString()}{_myCurrentUser.UserName} Disconnected signalR,ExceptionMessage:{exception?.Message}");
await base.OnDisconnectedAsync(exception);
}
#endregion
///
/// 进入模块编辑
///
///
///
public async Task ModuleEditStart(string moduleName)
{
await Clients.Group(moduleName).SendAsync(method, userIds);//给同组用户发送信息
await Clients.User("用户id").SendAsync(method, userIds);//给单个用户发送信息
await Clients.Users(new List { "用户id1", "用户id2" }).SendAsync(method, userIds);//给多个用户发送信息
}
///
/// 离开模块编辑
///
///
///
public async Task ModuleEditEnd(string moduleName)
{
await Clients.Group(moduleName).SendAsync(method, "发送信息");
}
}
只需要集成AbpHub,不需要 services.AddSignalR()
和 app.UseEndpoints(...)
,它们在 AbpAspNetCoreSignalRModule
中已经添加了.
AbpHub中还有很多abp中常用的属性,可直接在自己的Hub里使用
///
/// 连接
///
///
public override async Task OnConnectedAsync()
{
Logger.LogInformation($"UserHubConnected:tenantId:{CurrentTenant.Id},UserId{_myCurrentUser.Id?.ToString()}{_myCurrentUser.UserName}Connected SignalR");
await base.OnConnectedAsync();
}
///
/// 断开连接
///
///
///
public override async Task OnDisconnectedAsync(Exception exception)
{
Logger.LogInformation($"UserHubDisconnected:tenantId:{CurrentTenant.Id},UserId{_myCurrentUser.Id?.ToString()}{_myCurrentUser.UserName} Disconnected signalR,ExceptionMessage:{exception?.Message}");
await base.OnDisconnectedAsync(exception);
}
[Authorize]
public class UserHub : AbpHub
{
\\\业务代码
}
加上[Authorize]表明需要认证才可访问
对应的Host或Web需要添加token验证
Module中ConfigureServices方法添加使用 JWT 持有者中间件配置持有者令牌身份验证
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "Authority URL"; // TODO: Update URL
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) &&
(path.ToString().StartsWith("/signalr-hubs/")))
{
context.Token = accessToken;
}
return Task.CompletedTask;
}
};
});
/signalr-hubs/路径的token替换为请求中的access_token请求参数
测试网页
signalr.js安装ASP.NET Core SignalR JavaScript 客户端 | Microsoft Learn