SignalR 集成
建议使用ABP CLI安装包.
使用 ABP CLI
在项目的文件夹(.csproj文件)中打开命令行窗口,然后输入以下命令:
你通常需要将此软件包添加到应用程序的Web或API层,具体取决于你的架构.
手动安装
如果你想手动安装:
添加NuGet包到你的项目:
或者使用VisualStudio提供的UI安装
添加
AbpAspNetCoreSignalRModule
到你的模块的依赖列表.
[DependsOn(
//...other dependencies
typeof(AbpAspNetCoreSignalRModule) //Add the new module dependency
)]
{
}
客户端
客户端安装取决于你的UI框架/客户端类型.
ASP.NET Core MVC / Razor Pages UI
在你的Web项目的根文件夹中运行以下命令:
yarn add @abp/signalr
需要 yarn 环境.
它会添加 @abp/signalr
到你的项目中的 package.json
依赖项:
gulp
它会将SignalR JavaScript文件拷贝到你的项目:
最后将以下代码添加到页面/视图中, 添加包含 signalr.js
文件:
@section scripts {
<abp-script type="typeof(SignalRBrowserScriptContributor)" />
}
它需要将 @using Volo.Abp.AspNetCore.Mvc.UI.Packages.SignalR
添加到你的页面/视图.
这就是全部了,你可以在你的页面使用SignalR JavaScript API.
其他的UI框架/客户端
其他类型的客户端请参考微软文档.
本节介绍了使用ABP框架集成包的其他好处.
ABP自动将所有集线器注册到(做为transient)并映射集线器端点. 因此你不需要使用 app.UseEndpoints(...)
即可映射你的集线器.集线器路由(URL)通常是根据你的集线器名称确定.
示例:
public class MessagingHub : Hub
{
}
MessagingHub
集线器的路由为 /signalr-hubs/messaging
:
- 添加了标准
/signalr-hubs/
前缀. - 使用驼峰命名集线器名称,不包含
Hub
后缀.
如果你想指定路由,你可以使用 HubRoute
attribute:
AbpHub 基类
示例:
public class MessagingHub : AbpHub
{
public async Task SendMessage(string targetUserName, string message)
{
var currentUserName = CurrentUser.UserName; //Access to the current user info
var txt = L["MyText"]; //Localization
}
}
虽然可以将相同的属性注入到集线器构造函数中,但是这种方式简化了集线器类.
ABP会自动将所有集线器注册到作为transient service. 如果想要禁用集线器类自动添加依赖注入,只需要使用 DisableConventionalRegistration
attribute. 如果愿意,你仍然可以在模块的 ConfigureServices
方法中注册集线器类:
context.Services.AddTransient<MessagingHub>();
当你或ABP将类注册到依赖注入时,如前几节所述,它会自动映射到端点路由配置. 如果要手动映射集线器类,你可以使用 DisableAutoHubMap
attribute.
对于手动映射,你有两个选择:
Configure<AbpSignalROptions>(options =>
options.Hubs.Add(
new HubConfig(
typeof(MessagingHub), //Hub type
"/my-messaging/route", //Hub route (URL)
hubOptions =>
{
//Additional options
hubOptions.LongPolling.PollTimeout = TimeSpan.FromSeconds(30);
}
)
);
});
这是提供其他SignalR选项的好方式.
如果你不想禁用自动集线器map,但仍想执行其他SignalR配置,可以使用 options.Hubs.AddOrUpdate(...)
方法:
你可以通过这种方式修改在依赖模块(没有源代码访问权限)中定义的集线器类的选项.
- 在模块的
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
(如果你想更改/覆盖它).
参阅 ,它有一个简单的聊天页面,可以在(经过身份验证的)用户之间发送消息.
ABP框架不会更改SignalR. 就像在其他ASP.NET Core应用程序中一样,它也可以在基于ABP框架的应用程序中工作.