File tree 2 files changed +19
-6
lines changed
src/Grpc.Net.ClientFactory
test/Grpc.Net.ClientFactory.Tests
2 files changed +19
-6
lines changed Original file line number Diff line number Diff line change @@ -334,13 +334,23 @@ private static IHttpClientBuilder AddGrpcHttpClient<
334
334
335
335
services . PostConfigure < HttpClientFactoryOptions > ( name , options =>
336
336
{
337
- options . HttpMessageHandlerBuilderActions . Add ( static builder =>
337
+ options . HttpMessageHandlerBuilderActions . Add ( builder =>
338
338
{
339
339
if ( builder . PrimaryHandler == null )
340
340
{
341
341
// This will throw in .NET Standard 2.0 with a prompt that a user must set a handler.
342
342
// Because it throws it should only be called in PostConfigure if no handler has been set.
343
343
var handler = HttpHandlerFactory . CreatePrimaryHandler ( ) ;
344
+ #if NET5_0_OR_GREATER
345
+ if ( handler is SocketsHttpHandler socketsHttpHandler )
346
+ {
347
+ // A channel is created once per client, lives forever, and the primary handler never changes.
348
+ // It's possible that long lived connections cause the client to miss out on DNS changes.
349
+ // Replicate the core benefit of a handler lifetime (periodic connection recreation)
350
+ // by setting PooledConnectionLifetime to handler lifetime.
351
+ socketsHttpHandler . PooledConnectionLifetime = options . HandlerLifetime ;
352
+ }
353
+ #endif
344
354
#if NET5_0
345
355
handler = HttpHandlerFactory . EnsureTelemetryHandler ( handler ) ;
346
356
#endif
Original file line number Diff line number Diff line change @@ -195,7 +195,8 @@ public void CreateClient_NoPrimaryHandlerNet5OrLater_SocketsHttpHandlerConfigure
195
195
// Arrange
196
196
var services = new ServiceCollection ( ) ;
197
197
services
198
- . AddGrpcClient < TestGreeterClient > ( o => o . Address = new Uri ( "https://localhost" ) ) ;
198
+ . AddGrpcClient < TestGreeterClient > ( o => o . Address = new Uri ( "https://localhost" ) )
199
+ . SetHandlerLifetime ( TimeSpan . FromSeconds ( 10 ) ) ;
199
200
200
201
var serviceProvider = services . BuildServiceProvider ( validateScopes : true ) ;
201
202
@@ -206,20 +207,22 @@ public void CreateClient_NoPrimaryHandlerNet5OrLater_SocketsHttpHandlerConfigure
206
207
var handler = handlerFactory . CreateHandler ( nameof ( TestGreeterClient ) ) ;
207
208
208
209
// Assert
209
- var hasSocketsHttpHandler = false ;
210
+ SocketsHttpHandler ? socketsHttpHandler = null ;
210
211
HttpMessageHandler ? currentHandler = handler ;
211
212
while ( currentHandler is DelegatingHandler delegatingHandler )
212
213
{
213
214
currentHandler = delegatingHandler . InnerHandler ;
214
215
215
- if ( currentHandler ? . GetType ( ) == typeof ( SocketsHttpHandler ) )
216
+ if ( currentHandler is SocketsHttpHandler s )
216
217
{
217
- hasSocketsHttpHandler = true ;
218
+ socketsHttpHandler = s ;
218
219
break ;
219
220
}
220
221
}
221
222
222
- Assert . IsTrue ( hasSocketsHttpHandler ) ;
223
+ Assert . IsNotNull ( socketsHttpHandler ) ;
224
+ Assert . AreEqual ( true , socketsHttpHandler ! . EnableMultipleHttp2Connections ) ;
225
+ Assert . AreEqual ( TimeSpan . FromSeconds ( 10 ) , socketsHttpHandler ! . PooledConnectionLifetime ) ;
223
226
}
224
227
#endif
225
228
You can’t perform that action at this time.
0 commit comments