--- title: gRPC client factory integration in .NET Core author: jamesnk description: Learn how to create gRPC clients using the client factory. monikerRange: '>= aspnetcore-3.0' ms.author: jamesnk ms.date: 05/26/2020 no-loc: ["ASP.NET Core Identity", cookie, Cookie, Blazor, "Blazor Server", "Blazor WebAssembly", "Identity", "Let's Encrypt", Razor, SignalR] uid: grpc/clientfactory --- # gRPC client factory integration in .NET Core gRPC integration with `HttpClientFactory` offers a centralized way to create gRPC clients. It can be used as an alternative to [configuring stand-alone gRPC client instances](xref:grpc/client). Factory integration is available in the [Grpc.Net.ClientFactory](https://www.nuget.org/packages/Grpc.Net.ClientFactory) NuGet package. The factory offers the following benefits: * Provides a central location for configuring logical gRPC client instances * Manages the lifetime of the underlying `HttpClientMessageHandler` * Automatic propagation of deadline and cancellation in an ASP.NET Core gRPC service ## Register gRPC clients To register a gRPC client, the generic `AddGrpcClient` extension method can be used within `Startup.ConfigureServices`, specifying the gRPC typed client class and service address: ```csharp services.AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }); ``` The gRPC client type is registered as transient with dependency injection (DI). The client can now be injected and consumed directly in types created by DI. ASP.NET Core MVC controllers, SignalR hubs and gRPC services are places where gRPC clients can automatically be injected: ```csharp public class AggregatorService : Aggregator.AggregatorBase { private readonly Greeter.GreeterClient _client; public AggregatorService(Greeter.GreeterClient client) { _client = client; } public override async Task SayHellos(HelloRequest request, IServerStreamWriter responseStream, ServerCallContext context) { // Forward the call on to the greeter service using (var call = _client.SayHellos(request)) { await foreach (var response in call.ResponseStream.ReadAllAsync()) { await responseStream.WriteAsync(response); } } } } ``` ## Configure HttpClient `HttpClientFactory` creates the `HttpClient` used by the gRPC client. Standard `HttpClientFactory` methods can be used to add outgoing request middleware or to configure the underlying `HttpClientHandler` of the `HttpClient`: ```csharp services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .ConfigurePrimaryHttpMessageHandler(() => { var handler = new HttpClientHandler(); handler.ClientCertificates.Add(LoadCertificate()); return handler; }); ``` For more information, see [Make HTTP requests using IHttpClientFactory](xref:fundamentals/http-requests). ## Configure Channel and Interceptors gRPC-specific methods are available to: * Configure a gRPC client's underlying channel. * Add `Interceptor` instances that the client will use when making gRPC calls. ```csharp services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .AddInterceptor(() => new LoggingInterceptor()) .ConfigureChannel(o => { o.Credentials = new CustomCredentials(); }); ``` ## Deadline and cancellation propagation gRPC clients created by the factory in a gRPC service can be configured with `EnableCallContextPropagation()` to automatically propagate the deadline and cancellation token to child calls. The `EnableCallContextPropagation()` extension method is available in the [Grpc.AspNetCore.Server.ClientFactory](https://www.nuget.org/packages/Grpc.AspNetCore.Server.ClientFactory) NuGet package. Call context propagation works by reading the deadline and cancellation token from the current gRPC request context and automatically propagating them to outgoing calls made by the gRPC client. Call context propagation is an excellent way of ensuring that complex, nested gRPC scenarios always propagate the deadline and cancellation. ```csharp services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .EnableCallContextPropagation(); ``` By default, `EnableCallContextPropagation` raises an error if the client is used outside the context of a gRPC call. The error is designed to alert you that there isn't a call context to propagate. If you want to use the client outside of a call context, suppress the error when the client is configured with `SuppressContextNotFoundErrors`: ```csharp services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .EnableCallContextPropagation(o => o.SuppressContextNotFoundErrors = true); ``` For more information about deadlines and RPC cancellation, see [RPC life cycle](https://www.grpc.io/docs/guides/concepts/#rpc-life-cycle). ## Additional resources * *