项目

SignalR 集成

您已经可以按照 微软官方教程SignalR 添加到您的应用程序中。不过,ABP 提供了 SignalR 集成包,可以简化集成和使用过程。

安装

服务端

建议使用 ABP CLI 安装此包。

使用 ABP CLI

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

abp add-package Volo.Abp.AspNetCore.SignalR

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

如果尚未安装 ABP CLI,请先安装。有关其他安装选项,请参阅 包描述页面

手动安装

如需手动安装:

  1. Volo.Abp.AspNetCore.SignalR NuGet 包添加到您的项目:

    dotnet add package Volo.Abp.AspNetCore.SignalR
    

    或使用 Visual Studio 的 NuGet 包管理界面进行安装。

  2. 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 文件复制到您的项目中:

signal-js-file

最后,在页面/视图中添加以下代码以包含 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 基类

您可以继承自 AbpHubAbpHub<T>,而不是标准的 HubHub<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 属性。

手动映射有两种选项:

  1. 使用 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 类选项的方式。

  1. 模块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 集成演示 作为示例应用。它包含一个简单的聊天页面,用于在(已认证)用户之间发送消息。

signalr-demo-chat

注意事项

ABP 不会更改 SignalR。它在基于 ABP 的应用程序中的工作方式与任何其他 ASP.NET Core 应用程序相同。

请参考微软文档了解如何 托管和扩展 您的应用程序,集成到 AzureRedis 背板 等。

另请参阅

在本文档中