我正在使用 Microsoft.AspNetCore.SignalR 2.1 v1.0.4,并且使用 v1.0.4 的打字稿客户端使用 ChannelReader 流。
频道显示特定于单个实体的事件数据,因此当客户端的用户导航到该单个实体的页面呈现数据时,预计客户端将订阅频道。如果用户导航到同一页面但针对不同的实体,则客户端将进行另一个订阅调用。
现在我的问题是关于如何最好地取消订阅流,以及一般来说,流的生命周期对于集线器连接停止/启动场景下的客户端来说是什么,以及服务器是否显式中止连接(由于 access_token 超时从而触发客户端刷新他们的连接)?
似乎没有从 api 中浮现出一些连接状态,所以我目前使用 RxJs Subject 将一些连接状态呈现给我的 UI 组件/服务,即当集线器连接的启动调用成功时,我浮现“真”,当onclose 回调称为 I 表面“假”。这允许我尝试在先前订阅的流上调用 dispose 以在连接断开/停止期间清理内容,然后在成功启动调用时再次调用订阅流。
我试过在一个流上调用 dispose 如果集线器已连接,这很好,但如果连接处于断开状态,它会出错。我想知道这是否是一个错误。即使集线器断开连接,我也应该能够处理流吗?
可以只做一个delete streamsubscription然后根据需要重新创建,还是会以任何方式泄漏?
我们在 Signalr .Net Core 中遇到了重新连接问题,重新连接到 signalr-hub 的最佳实践是什么?
以下似乎是有关重新连接的最受尊敬的文章。但似乎已经过时了,不是吗? 将 SignalR 2.0 .NET 客户端重新连接到服务器集线器的最佳实践
所以我有一个 .net core (2.1) API,它使用 JWT 令牌进行身份验证。我可以登录并成功拨打经过身份验证的电话。
我正在为客户端使用 React (16.6.3),它获取 JWT 代码并对 API 进行经过身份验证的调用。
我正在尝试向站点添加信号集线器。如果我不在集线器类上放置 [Authorize] 属性。我可以连接、发送和接收消息(目前它是一个基本的聊天室)。
当我将 [Authorize] 属性添加到类时,React 应用程序会将 HttpPost 生成到example.com/hubs/chat/negotiate. 我会得到一个401状态码。在Authorization: Bearer abc.....头会向上传递。
要在 React 中构建集线器,我使用:
const hubConn = new signalR.HubConnectionBuilder()
.withUrl(`${baseUrl}/hubs/chat`, { accessTokenFactory: () => jwt })
.configureLogging(signalR.LogLevel.Information)
.build();
Run Code Online (Sandbox Code Playgroud)
其中jwt变量是令牌。
我有一些身份验证设置:
services.AddAuthentication(a =>
{
a.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
a.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.SaveToken = false;
options.Audience = jwtAudience;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true, …Run Code Online (Sandbox Code Playgroud) 编辑:见底部
我是 SignalR 的新手,并尝试使用这个库和 ASP.NET Core Web API 用 Angular7 客户端实现一个简单的场景。我所需要的只是使用 SignalR 来通知客户端 API 控制器方法中一些冗长操作的进度。
经过多次尝试,我达到了显然已建立连接的程度,但是当长任务开始运行并发送消息时,我的客户端似乎没有收到任何内容,网络套接字中也没有出现任何流量(Chrome F12 -网络 - WS)。
我在这里发布了详细信息,这可能对其他新手也有用(完整源代码位于https://1drv.ms/u/s!AsHCfliT740PkZh4cHY3r7I8f-VQiQ)。可能我只是犯了一些明显的错误,但在文档和谷歌搜索中我找不到与我的代码片段完全不同的代码片段。谁能给个提示?
服务器端我的起点是https://msdn.microsoft.com/en-us/magazine/mt846469.aspx,加上文档在https://docs.microsoft.com/en-us/aspnet/core/ signalr/hubs?view=aspnetcore-2.2。我试图用它创建一个虚拟的实验解决方案。
我以食谱形式的代码片段如下。
(A) 服务器端
1.创建一个新的 ASP.NET 核心 Web API 应用程序。没有身份验证或 Docker,只是为了保持最小化。
2.添加NuGet包Microsoft.AspNetCore.SignalR。
3.在Startup.cs,ConfigureServices:
public void ConfigureServices(IServiceCollection services)
{
// CORS
services.AddCors(o => o.AddPolicy("CorsPolicy", builder =>
{
builder.AllowAnyMethod()
.AllowAnyHeader()
// https://github.com/aspnet/SignalR/issues/2110 for AllowCredentials
.AllowCredentials()
.WithOrigins("http://localhost:4200");
}));
// SignalR
services.AddSignalR();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Run Code Online (Sandbox Code Playgroud)
以及相应的Configure方法: …
到目前为止,我看到的所有文档都展示了如何通过集线器的OnConnected/OnDisconnected方法将连接 ID 映射到用户。但是如何在无服务器设置中执行此操作?在 Azure Functions 中完全可能吗?
我已经实现了negotiate端点,所以我可以访问SignalRConnectionInfo. 我有一个带有SignalR输出绑定的 Send 方法,我可以向其中添加 的实例SignalRMessage,然后将其广播到所有连接的客户端。该SignalRMessage班确实有UserId和GroupName性质,所以我相信它一定是可以指定用户或组将消息发送给。
我正在学习如何实现信号器。我参考了教程LINK并在没有数据库连接的情况下创建了示例应用程序,该应用程序运行良好。
技术 - SinalRCore、Entityframework 核心、Dontnet 核心 API、Angular 8
在没有数据库连接的情况下,SingalR 能够更新我发送到 angular 的数据。我可以毫无问题地看到更改后的数据。
当我试图从数据库中获取数据时,我正在获取数据,但是当我在数据库中进行更新时,更新没有反映在我得到的结果 json 中。
我正在使用一个空集线器。使用一个计时器,每 2 秒触发一次。
这是我的 API 操作。
namespace MyUtilities.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class AlertsController : ControllerBase
{
private IHubContext<AlertHub> _hub;
private readonly FolderContext dbContext;
public AlertsController(IHubContext<AlertHub> hub,FolderContext Context )
{
_hub = hub;
dbContext= Context;
}
public IActionResult Get()
{
var res = dbContext.Folder.Join(dbContext.FilterCount,
f => f.lFolderId,
e => e.lFolderId,
(f, e) => new
{
lFolderId = f.lFolderId,
sTileName = f.sMnemonic,
Icon = …Run Code Online (Sandbox Code Playgroud) 我有一个 ASPNet.Core WebApi,带有 signalR。我有 Angular 应用程序,它使用 webAPI,我想将其替换为 Blazor Web assembly 应用程序。我在 Blazor 应用程序中遇到 signalR 问题。
我创建了一个 hubconnection,对其进行设置,当服务器发送数据时,不会调用 Hubconnection.On 方法。这是我的代码:
protected override async Task OnInitializedAsync()
{
_hubConnection = new HubConnectionBuilder()
.WithUrl("https://localhost:45299/hubs/accounthub", cfg =>
{
cfg.SkipNegotiation = true;
cfg.AccessTokenProvider = () => Task.FromResult(token);
cfg.Transports = HttpTransportType.WebSockets;
})
.Build();
_hubConnection.On<IEnumerable<AccountResponse>>("accountschanged", (accounts) =>
{
foreach(var account in accounts)
{
Console.WriteLine(account.Name);
}
});
await _hubConnection.StartAsync();
}
Run Code Online (Sandbox Code Playgroud)
在网络选项卡中,我看到连接正常,我收到新数据,但 hubconnection.On 中的方法不会被触发。我仔细检查了方法名称,它是相同的。在角度应用程序中,它工作正常,并且当数据从服务器发送时,我不认为服务器代码有任何问题。
我使用 Fluxor 进行状态管理,并在“On”方法中触发一个操作,为了简单起见,我只是用一个 Console.WriteLine 替换了它。
编辑:添加服务器代码,并收到消息这是服务器代码,当帐户更改时会调用“AccountsChanged”:
public class AccountHub : Hub, IAccountHub
{
private readonly IHubContext<AccountHub> …Run Code Online (Sandbox Code Playgroud) 我有一个 Asp.Net Core Api 3.1 和一个 Azure WebJob,两者都在 Azure 应用服务上运行。他们都需要发送通知,但都不会接收消息。分解它:
我在云中拥有每个应用程序都指向的 Azure SignalR 服务的单个实例。
我创建的 Hub 类位于 Api 和 WebJob 项目都引用的库中。
客户端只能通过 Api 连接到 Hub。
当 Api 向连接发送消息时一切正常,但 WebJob 却不然。
我真的不想将 WebJob 作为客户端运行,因为那样我就必须处理身份验证。我只是希望它作为同一集线器的另一个实例运行,该集线器将消息发送到与 API 相同的组。此外,此 WebJob 不适合作为 Azure 函数运行,因为它需要很长时间。
我在配置 WebJob 的方式中遗漏了一些内容,因为它似乎没有连接到 Azure SignalR。
当 WebJob 尝试发送消息时,我收到以下错误:(我尚未发布到 Azure,因此这一切都发生在我的本地计算机上)
Microsoft.Azure.SignalR.ServiceLifetimeManager[100] 无法发送消息(空)。Microsoft.Azure.SignalR.Common.AzureSignalRNotConnectedException:Azure SignalR 服务尚未连接,请稍后重试。在 Microsoft.Azure.SignalR.ServiceConnectionManager 1.WriteAsync(ServiceMessage serviceMessage) at Microsoft.Azure.SignalR.ServiceLifetimeManagerBase1.<>c__DisplayClass22_0 1.<WriteAsync>b__0(T m) at Microsoft.Azure.SignalR.ServiceLifetimeManagerBase1.WriteCoreAsync[T](T 消息,Func`2 任务)
网络工作主要:
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MyProject.Data; …Run Code Online (Sandbox Code Playgroud) azure azure-webjobs azure-webjobs-triggered asp.net-core-signalr azure-signalr
我们有一个中心,可以像聊天一样管理客户。
在某些情况下,我们注意到存在未调用断开连接事件的“死”连接。
在 ASP .NET 框架 4.5.2 SignalR 上,我们用来ITransportHeartbeat检查当前的连接状态:
// SignalR connection state check - .NET framework 4.5.2
var heartBeat = GlobalHost.DependencyResolver.Resolve<ITransportHeartbeat>();
var connectionId = appConnection;
var connection = heartBeat.GetConnections().FirstOrDefault(
c => c.ConnectionId == connectionId);
if (!connection.IsAlive)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
我ITransportHeartbeat在 SignalR .NET Core 上再也看不到了。有什么办法可以找到当前特定的连接状态吗?
从这里开始,它指出
所有客户端都将使用相同的 URL 与您的服务建立 SignalR 连接(“/signalr”或您的自定义 URL,如果您指定了一个),并且该连接用于服务定义的所有集线器。
与在单个类中定义所有集线器功能相比,多个集线器没有性能差异。
我想这样做的原因只是因为我唯一的集线器正在成为神级,但是,我找不到在 .NET Core 中做多个集线器的方法(同时共享一个连接)。我希望我能这样做,然后我就可以像在 Web API 中那样管理我的代码。
一种可能的解决方案可能会创建多个连接,但我必须在我的客户端管理不同的连接,只是为了防止服务器代码上的上帝类。
从这里开始,有人指出将方法映射到外部类是一种解决方法。这是唯一的解决方法吗?