SignalR 集成
您已经可以按照 微软官方教程 将 SignalR 添加到您的应用程序中。不过,ABP 提供了 SignalR 集成包,可以简化集成和使用过程。
安装
服务端
建议使用 ABP CLI 安装此包。
使用 ABP CLI
在项目文件夹(.csproj 文件所在目录)中打开命令行窗口,输入以下命令:
abp add-package Volo.Abp.AspNetCore.SignalR
通常您需要将此包添加到应用程序的 Web 层或 API 层,具体取决于您的架构。
手动安装
如需手动安装:
将 Volo.Abp.AspNetCore.SignalR NuGet 包添加到您的项目:
dotnet add package Volo.Abp.AspNetCore.SignalR或使用 Visual Studio 的 NuGet 包管理界面进行安装。
将
AbpAspNetCoreSignalRModule添加到模块的依赖列表中:
[DependsOn(
//...其他依赖
typeof(AbpAspNetCoreSignalRModule) //添加新模块依赖
)]
public class YourModule : AbpModule
{
}
您无需使用
services.AddSignalR()和app.UseEndpoints(...),这些由AbpAspNetCoreSignalRModule自动处理。
客户端
客户端安装取决于您的 UI 框架/客户端类型。
ASP.NET Core MVC / Razor Pages UI
在 Web 项目根目录中运行以下命令:
abp add-package @abp/signalr
这将在项目的 package.json 依赖项中添加 @abp/signalr:
{
...
"dependencies": {
...
"@abp/signalr": "~2.7.0"
}
}
在 Web 项目根目录中运行以下 ABP CLI 命令:
abp install-libs
这将把 SignalR JavaScript 文件复制到您的项目中:
最后,在页面/视图中添加以下代码以包含 signalr.js 文件:
@section scripts {
<abp-script type="typeof(SignalRBrowserScriptContributor)" />
}
需要在页面/视图中添加 @using Volo.Abp.AspNetCore.Mvc.UI.Packages.SignalR。
您也可以使用标准方式添加
signalr.js文件。但使用SignalRBrowserScriptContributor具有额外优势。详情请参阅 客户端包管理 和 打包与压缩 文档。
至此完成。您可以在页面中使用 SignalR JavaScript API。
其他 UI 框架/客户端
请参考 微软文档 了解其他类型的客户端。
ABP 集成优势
本节介绍使用 ABP 集成包时的额外优势。
Hub 路由与映射
ABP 自动将所有 Hub 注册到 依赖注入(作为瞬时服务)并映射 Hub 端点。因此您无需使用 app.UseEndpoints(...) 来映射 Hub。Hub 路由(URL)基于 Hub 名称按约定确定。
示例:
public class MessagingHub : Hub
{
//...
}
MessagingHub 的 Hub 路由将为 /signalr-hubs/messaging:
- 添加标准前缀
/signalr-hubs/ - 接续 短横线命名法 的 Hub 名称,不包含
Hub后缀。
如需指定路由,可使用 HubRoute 属性:
[HubRoute("/my-messaging-hub")]
public class MessagingHub : Hub
{
//...
}
AbpHub 基类
您可以继承自 AbpHub 或 AbpHub<T>,而不是标准的 Hub 和 Hub<T> 类,这些基类提供了如 CurrentUser 等实用属性。
示例:
public class MessagingHub : AbpHub
{
public async Task SendMessage(string targetUserName, string message)
{
var currentUserName = CurrentUser.UserName; //访问当前用户信息
var txt = L["MyText"]; //本地化
}
}
虽然您可以将相同属性注入到 Hub 构造函数中,但这种方式简化了 Hub 类。
手动注册/映射
ABP 自动将所有 Hub 注册到 依赖注入 作为 瞬时服务。如需 禁用自动依赖注入注册,只需添加 DisableConventionalRegistration 属性。您仍可在模块的 ConfigureServices 方法中将 Hub 类注册到依赖注入:
context.Services.AddTransient<MessagingHub>();
当 您或 ABP 将类注册到依赖注入时,它会自动映射到端点路由配置,如前文所述。如需手动映射 Hub 类,可使用 DisableAutoHubMap 属性。
手动映射有两种选项:
- 使用
AbpSignalROptions添加映射配置(在 模块 的ConfigureServices方法中),这样 ABP 仍会为您的 Hub 执行端点映射:
Configure<AbpSignalROptions>(options =>
{
options.Hubs.Add(
new HubConfig(
typeof(MessagingHub), //Hub 类型
"/my-messaging/route", //Hub 路由(URL)
hubOptions =>
{
//附加选项
hubOptions.LongPolling.PollTimeout = TimeSpan.FromSeconds(30);
}
)
);
});
这是提供额外 SignalR 选项的好方法。
如果不想禁用自动 Hub 映射,但仍想执行额外的 SignalR 配置,请使用 options.Hubs.AddOrUpdate(...) 方法:
Configure<AbpSignalROptions>(options =>
{
options.Hubs.AddOrUpdate(
typeof(MessagingHub), //Hub 类型
config => //附加配置
{
config.RoutePattern = "/my-messaging-hub"; //覆盖默认路由
config.ConfigureActions.Add(hubOptions =>
{
//附加选项
hubOptions.LongPolling.PollTimeout = TimeSpan.FromSeconds(30);
});
}
);
});
这是修改依赖模块(您无法访问源代码)中定义的 Hub 类选项的方式。
- 在 模块 的
OnApplicationInitialization方法中修改app.UseConfiguredEndpoints(添加 lambda 方法作为参数):
app.UseConfiguredEndpoints(endpoints =>
{
endpoints.MapHub<MessagingHub>("/my-messaging-hub", options =>
{
options.LongPolling.PollTimeout = TimeSpan.FromSeconds(30);
});
});
UserIdProvider
ABP 实现了 SignalR 的 IUserIdProvider 接口,从 ABP 的 ICurrentUser 服务提供当前用户 ID(参见 当前用户服务),因此它将与应用程序的身份验证系统集成。实现类为 AbpSignalRUserIdProvider,如需更改/重写可自行实现。
示例应用
请参阅 SignalR 集成演示 作为示例应用。它包含一个简单的聊天页面,用于在(已认证)用户之间发送消息。
注意事项
ABP 不会更改 SignalR。它在基于 ABP 的应用程序中的工作方式与任何其他 ASP.NET Core 应用程序相同。
请参考微软文档了解如何 托管和扩展 您的应用程序,集成到 Azure 或 Redis 背板 等。
抠丁客




