SignalR 集成

    建议使用ABP CLI安装包.

    使用 ABP CLI

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

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

    手动安装

    如果你想手动安装:

    1. 添加NuGet包到你的项目:

      或者使用VisualStudio提供的UI安装

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

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

    客户端

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

    ASP.NET Core MVC / Razor Pages UI

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

    1. yarn add @abp/signalr

    需要 yarn 环境.

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

    1. gulp

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

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

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

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

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

    其他的UI框架/客户端

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

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

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

    示例:

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

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

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

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

    AbpHub 基类

    示例:

    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. }

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

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

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

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

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

    1. Configure<AbpSignalROptions>(options =>
    2. options.Hubs.Add(
    3. new HubConfig(
    4. typeof(MessagingHub), //Hub type
    5. "/my-messaging/route", //Hub route (URL)
    6. hubOptions =>
    7. {
    8. //Additional options
    9. hubOptions.LongPolling.PollTimeout = TimeSpan.FromSeconds(30);
    10. }
    11. )
    12. );
    13. });

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

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

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

    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-chat

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