From 9680195978300d64399af1c08e6e9453b47d02d4 Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Tue, 14 Mar 2023 11:14:16 -0700 Subject: [PATCH 1/2] Fix sending to another client from OnConnectedAsync --- .../Core/src/Internal/HubCallerClients.cs | 2 +- .../HubConnectionHandlerTestUtils/Hubs.cs | 12 +++++++ .../SignalR/test/HubConnectionHandlerTests.cs | 33 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/SignalR/server/Core/src/Internal/HubCallerClients.cs b/src/SignalR/server/Core/src/Internal/HubCallerClients.cs index 15d2c036602e..0c5b0c7599a8 100644 --- a/src/SignalR/server/Core/src/Internal/HubCallerClients.cs +++ b/src/SignalR/server/Core/src/Internal/HubCallerClients.cs @@ -50,7 +50,7 @@ public ISingleClientProxy Client(string connectionId) { if (!InvokeAllowed) { - return new NoInvokeSingleClientProxy(_hubClients.Client(_connectionId)); + return new NoInvokeSingleClientProxy(_hubClients.Client(connectionId)); } return new SingleClientProxy(_hubClients.Client(connectionId), this); } diff --git a/src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs b/src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs index 53e0915d16e1..b5b1d9c701df 100644 --- a/src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs +++ b/src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs @@ -1396,3 +1396,15 @@ public void ManyParams(int a1, string a2, bool a3, float a4, string a5, int a6, int a64, [FromService] Service1 service) { } } + +public class OnConnectedSendToClientHub : Hub +{ + public override async Task OnConnectedAsync() + { + string id = Context.GetHttpContext()?.Request.Query["client"] ?? string.Empty; + if (!string.IsNullOrEmpty(id)) + { + await Clients.Client(id).SendAsync("Test", 1); + } + } +} diff --git a/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs b/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs index e2f59c0b448a..d8175362d0ec 100644 --- a/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs +++ b/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs @@ -4891,6 +4891,39 @@ public void TooManyParametersWithServiceThrows() () => serviceProvider.GetService>()); } + [Fact] + public async Task SendToAnotherClientFromOnConnectedAsync() + { + var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(provider => + { + provider.AddSignalR(options => + { + options.EnableDetailedErrors = true; + }); + }); + var connectionHandler = serviceProvider.GetService>(); + + using (var client1 = new TestClient()) + using (var client2 = new TestClient()) + { + var httpContext = new DefaultHttpContext(); + httpContext.Request.QueryString = new QueryString($"?client={client1.Connection.ConnectionId}"); + var feature = new TestHttpContextFeature + { + HttpContext = httpContext + }; + client2.Connection.Features.Set(feature); + + var connectionHandlerTask = await client1.ConnectAsync(connectionHandler).DefaultTimeout(); + _ = await client2.ConnectAsync(connectionHandler).DefaultTimeout(); + + var message = Assert.IsType(await client1.ReadAsync().DefaultTimeout()); + Assert.Equal(1, message.Arguments.Length); + Assert.Equal(1L, message.Arguments[0]); + Assert.Equal("Test", message.Target); + } + } + private class CustomHubActivator : IHubActivator where THub : Hub { public int ReleaseCount; From b4ea9d16c6f4c9b8eadd6e21f38866fd45911369 Mon Sep 17 00:00:00 2001 From: Brennan Date: Tue, 14 Mar 2023 11:33:42 -0700 Subject: [PATCH 2/2] Update src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs --- src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs b/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs index d8175362d0ec..eefd6c4c60bd 100644 --- a/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs +++ b/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs @@ -4918,7 +4918,7 @@ public async Task SendToAnotherClientFromOnConnectedAsync() _ = await client2.ConnectAsync(connectionHandler).DefaultTimeout(); var message = Assert.IsType(await client1.ReadAsync().DefaultTimeout()); - Assert.Equal(1, message.Arguments.Length); + Assert.Single(message.Arguments); Assert.Equal(1L, message.Arguments[0]); Assert.Equal("Test", message.Target); }