SignalR 集成

你可以按照标准的微软教程添加SignalR到你的应用程序,但ABP提供了简化集成的SignalR集成包.

安装

服务器端

建议使用ABP CLI安装包.

使用 ABP CLI

在项目的文件夹(.csproj文件)中打开命令行窗口,然后输入以下命令:

  1. abp add-package Volo.Abp.AspNetCore.SignalR

你通常需要将此软件包添加到应用程序的Web或API层,具体取决于你的架构.

手动安装

如果你想手动安装:

  1. 添加Volo.Abp.AspNetCore.SignalRNuGet包到你的项目:

    1. Install-Package Volo.Abp.AspNetCore.SignalR

    或者使用VisualStudio提供的UI安装

  2. 添加 AbpAspNetCoreSignalRModule 到你的模块的依赖列表.

  1. [DependsOn(
  2. //...other dependencies
  3. typeof(AbpAspNetCoreSignalRModule) //Add the new module dependency
  4. )]
  5. public class YourModule : AbpModule
  6. {
  7. }

你不需要 services.AddSignalR()app.UseEndpoints(...),它们在 AbpAspNetCoreSignalRModule 中已经添加了.

客户端

客户端安装取决于你的UI框架/客户端类型.

ASP.NET Core MVC / Razor Pages UI

在你的Web项目的根文件夹中运行以下命令:

  1. yarn add @abp/signalr

需要 yarn 环境.

它会添加 @abp/signalr 到你的项目中的 package.json 依赖项:

  1. {
  2. ...
  3. "dependencies": {
  4. ...
  5. "@abp/signalr": "~2.7.0"
  6. }
  7. }

在你的Web项目的根文件夹中运行 gulp:

  1. gulp

它会将SignalR JavaScript文件拷贝到你的项目:

signal-js-file

最后将以下代码添加到页面/视图中, 添加包含 signalr.js 文件:

  1. @section scripts {
  2. <abp-script type="typeof(SignalRBrowserScriptContributor)" />
  3. }

它需要将 @using Volo.Abp.AspNetCore.Mvc.UI.Packages.SignalR 添加到你的页面/视图.

你可以用标准方式添加 signalr.js 文件. 但是使用 SignalRBrowserScriptContributor 具有其他好处. 有关详细信息,请参见客户端程序包管理捆绑和压缩文档.

这就是全部了,你可以在你的页面使用SignalR JavaScript API.

其他的UI框架/客户端

其他类型的客户端请参考微软文档.

ABP框架集成

本节介绍了使用ABP框架集成包的其他好处.

Hub 路由与Mapping

ABP自动将所有集线器注册到依赖注入(做为transient)并映射集线器端点. 因此你不需要使用 app.UseEndpoints(...) 即可映射你的集线器.集线器路由(URL)通常是根据你的集线器名称确定.

示例:

  1. public class MessagingHub : Hub
  2. {
  3. //...
  4. }

MessagingHub 集线器的路由为 /signalr-hubs/messaging:

  • 添加了标准 /signalr-hubs/ 前缀.
  • 使用驼峰命名集线器名称,不包含 Hub 后缀.

如果你想指定路由,你可以使用 HubRoute attribute:

  1. [HubRoute("/my-messaging-hub")]
  2. public class MessagingHub : Hub
  3. {
  4. //...
  5. }

AbpHub 基类

你可以从 AbpHubAbpHub<T> 继承标准的 HubHub<T> 类,它们具有实用的基本属性,如 CurrentUser.

示例:

  1. public class MessagingHub : AbpHub
  2. {
  3. public async Task SendMessage(string targetUserName, string message)
  4. {
  5. var currentUserName = CurrentUser.UserName; //Access to the current user info
  6. var txt = L["MyText"]; //Localization
  7. }
  8. }

虽然可以将相同的属性注入到集线器构造函数中,但是这种方式简化了集线器类.

手动注册/Mapping

ABP会自动将所有集线器注册到依赖注入作为transient service. 如果想要禁用集线器类自动添加依赖注入,只需要使用 DisableConventionalRegistration attribute. 如果愿意,你仍然可以在模块的 ConfigureServices 方法中注册集线器类:

  1. context.Services.AddTransient<MessagingHub>();

你或ABP将类注册到依赖注入时,如前几节所述,它会自动映射到端点路由配置. 如果要手动映射集线器类,你可以使用 DisableAutoHubMap attribute.

对于手动映射,你有两个选择:

  1. 使用 AbpSignalROptions 添加map配置(在模块ConfigureServices 方法中),ABP会为集线器执行端点映射:
  1. Configure<AbpSignalROptions>(options =>
  2. {
  3. options.Hubs.Add(
  4. new HubConfig(
  5. typeof(MessagingHub), //Hub type
  6. "/my-messaging/route", //Hub route (URL)
  7. hubOptions =>
  8. {
  9. //Additional options
  10. hubOptions.LongPolling.PollTimeout = TimeSpan.FromSeconds(30);
  11. }
  12. )
  13. );
  14. });

这是提供其他SignalR选项的好方式.

如果你不想禁用自动集线器map,但仍想执行其他SignalR配置,可以使用 options.Hubs.AddOrUpdate(...) 方法:

  1. Configure<AbpSignalROptions>(options =>
  2. {
  3. options.Hubs.AddOrUpdate(
  4. typeof(MessagingHub), //Hub type
  5. config => //Additional configuration
  6. {
  7. config.RoutePattern = "/my-messaging-hub"; //override the default route
  8. config.ConfigureActions.Add(hubOptions =>
  9. {
  10. //Additional options
  11. hubOptions.LongPolling.PollTimeout = TimeSpan.FromSeconds(30);
  12. });
  13. }
  14. );
  15. });

你可以通过这种方式修改在依赖模块(没有源代码访问权限)中定义的集线器类的选项.

  1. 模块OnApplicationInitialization 方法中更改 app.UseConfiguredEndpoints(添加了lambda方法作为参数).
  1. app.UseConfiguredEndpoints(endpoints =>
  2. {
  3. endpoints.MapHub<MessagingHub>("/my-messaging-hub", options =>
  4. {
  5. options.LongPolling.PollTimeout = TimeSpan.FromSeconds(30);
  6. });
  7. });

UserIdProvider

ABP实现 SignalRIUserIdProvider 接口,从ABP框架的 ICurrentUser 服务提供当前用户ID(请参阅当前用户服务),它将集成到应用程序的身份验证系统中,实现类是 AbpSignalRUserIdProvider (如果你想更改/覆盖它).

示例应用程序

参阅 SignalR集成Demo,它有一个简单的聊天页面,可以在(经过身份验证的)用户之间发送消息.

signalr-demo-chat

备注

ABP框架不会更改SignalR. 就像在其他ASP.NET Core应用程序中一样,它也可以在基于ABP框架的应用程序中工作.

参考微软文档托管和扩展您的应用程序,集成AzureRedis底版…等.

另请参阅