public async Task UnaryCall_MultipleChannelsShareHandler_ReconnectBetweenCalls_Success() { // Ignore errors SetExpectedErrorsFilter(writeContext => { return(true); }); string?host = null; Task <HelloReply> UnaryMethod(HelloRequest request, ServerCallContext context) { host = context.Host; return(Task.FromResult(new HelloReply { Message = request.Name })); } // Arrange using var endpoint = BalancerHelpers.CreateGrpcEndpoint <HelloRequest, HelloReply>(50051, UnaryMethod, nameof(UnaryMethod)); var socketsHttpHandler = new SocketsHttpHandler(); var channel1 = await BalancerHelpers.CreateChannel(LoggerFactory, new RoundRobinConfig(), new[] { endpoint.Address }, socketsHttpHandler); var channel2 = await BalancerHelpers.CreateChannel(LoggerFactory, new RoundRobinConfig(), new[] { endpoint.Address }, socketsHttpHandler); var client1 = TestClientFactory.Create(channel1, endpoint.Method); var client2 = TestClientFactory.Create(channel2, endpoint.Method); // Act var reply1Task = client1.UnaryCall(new HelloRequest { Name = "Balancer" }).ResponseAsync.DefaultTimeout(); var reply2Task = client2.UnaryCall(new HelloRequest { Name = "Balancer" }).ResponseAsync.DefaultTimeout(); // Assert Assert.AreEqual("Balancer", (await reply1Task).Message); Assert.AreEqual("Balancer", (await reply2Task).Message); Assert.AreEqual("127.0.0.1:50051", host); // Wait for connecting or failure. // Connecting is faster to wait for, but the status could change so quickly that wait for state change is not triggered. // Use failure as backup status. var expectedStates = new[] { ConnectivityState.Connecting, ConnectivityState.TransientFailure }; var waitForConnectingTask = Task.WhenAll( BalancerHelpers.WaitForChannelStatesAsync(Logger, channel1, expectedStates, channelId: 1), BalancerHelpers.WaitForChannelStatesAsync(Logger, channel2, expectedStates, channelId: 2)); Logger.LogInformation("Ending " + endpoint.Address); endpoint.Dispose(); await waitForConnectingTask.DefaultTimeout(); Logger.LogInformation("Restarting"); using var endpointNew = BalancerHelpers.CreateGrpcEndpoint <HelloRequest, HelloReply>(50051, UnaryMethod, nameof(UnaryMethod)); // Act reply1Task = client1.UnaryCall(new HelloRequest { Name = "Balancer" }, new CallOptions().WithWaitForReady()).ResponseAsync.DefaultTimeout(); reply2Task = client2.UnaryCall(new HelloRequest { Name = "Balancer" }, new CallOptions().WithWaitForReady()).ResponseAsync.DefaultTimeout(); // Assert Assert.AreEqual("Balancer", (await reply1Task).Message); Assert.AreEqual("Balancer", (await reply2Task).Message); Assert.AreEqual("127.0.0.1:50051", host); }