Skip to content

Commit 5d9bded

Browse files
Fix client results with Hub<T> IHubContext (#41763)
1 parent 95374b3 commit 5d9bded

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed

src/SignalR/server/Core/src/Internal/HubClients`T.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ public HubClients(HubLifetimeManager<THub> lifetimeManager)
1515

1616
public T All { get; }
1717

18+
public T Single(string connectionId)
19+
{
20+
return TypedClientBuilder<T>.Build(new SingleClientProxyWithInvoke<THub>(_lifetimeManager, connectionId));
21+
}
22+
1823
public T AllExcept(IReadOnlyList<string> excludedConnectionIds)
1924
{
2025
return TypedClientBuilder<T>.Build(new AllClientsExceptProxy<THub>(_lifetimeManager, excludedConnectionIds));

src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,8 @@ public interface Test
530530
{
531531
Task Send(string message);
532532
Task Broadcast(string message);
533+
534+
Task<int> GetClientResult(int value);
533535
}
534536

535537
public class OnConnectedThrowsHub : Hub

src/SignalR/server/SignalR/test/HubConnectionHandlerTests.ClientResult.cs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,68 @@ public async Task ThrowsWhenParallelHubInvokesNotEnabled()
103103
}
104104
}
105105
}
106+
107+
[Fact]
108+
public async Task CanUseClientResultsWithIHubContext()
109+
{
110+
using (StartVerifiableLog())
111+
{
112+
var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(null, LoggerFactory);
113+
var connectionHandler = serviceProvider.GetService<HubConnectionHandler<MethodHub>>();
114+
115+
using var client = new TestClient();
116+
117+
var connectionHandlerTask = await client.ConnectAsync(connectionHandler);
118+
119+
// Wait for a connection, or for the endpoint to fail.
120+
await client.Connected.OrThrowIfOtherFails(connectionHandlerTask).DefaultTimeout();
121+
122+
var context = serviceProvider.GetRequiredService<IHubContext<MethodHub>>();
123+
var resultTask = context.Clients.Single(client.Connection.ConnectionId).InvokeAsync<int>("GetClientResult", 1);
124+
125+
var message = await client.ReadAsync().DefaultTimeout();
126+
var invocation = Assert.IsType<InvocationMessage>(message);
127+
128+
Assert.Single(invocation.Arguments);
129+
Assert.Equal(1L, invocation.Arguments[0]);
130+
Assert.Equal("GetClientResult", invocation.Target);
131+
132+
await client.SendHubMessageAsync(CompletionMessage.WithResult(invocation.InvocationId, 2)).DefaultTimeout();
133+
134+
var result = await resultTask.DefaultTimeout();
135+
Assert.Equal(2, result);
136+
}
137+
}
138+
139+
[Fact]
140+
public async Task CanUseClientResultsWithIHubContextT()
141+
{
142+
using (StartVerifiableLog())
143+
{
144+
var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(null, LoggerFactory);
145+
var connectionHandler = serviceProvider.GetService<HubConnectionHandler<HubT>>();
146+
147+
using var client = new TestClient();
148+
149+
var connectionHandlerTask = await client.ConnectAsync(connectionHandler);
150+
151+
// Wait for a connection, or for the endpoint to fail.
152+
await client.Connected.OrThrowIfOtherFails(connectionHandlerTask).DefaultTimeout();
153+
154+
var context = serviceProvider.GetRequiredService<IHubContext<HubT, Test>>();
155+
var resultTask = context.Clients.Single(client.Connection.ConnectionId).GetClientResult(1);
156+
157+
var message = await client.ReadAsync().DefaultTimeout();
158+
var invocation = Assert.IsType<InvocationMessage>(message);
159+
160+
Assert.Single(invocation.Arguments);
161+
Assert.Equal(1L, invocation.Arguments[0]);
162+
Assert.Equal("GetClientResult", invocation.Target);
163+
164+
await client.SendHubMessageAsync(CompletionMessage.WithResult(invocation.InvocationId, 2)).DefaultTimeout();
165+
166+
var result = await resultTask.DefaultTimeout();
167+
Assert.Equal(2, result);
168+
}
169+
}
106170
}

0 commit comments

Comments
 (0)