gRPC integrację klienta w programie .NET CoregRPC client factory integration in .NET Core

Integracja gRPC z programem HttpClientFactory oferuje scentralizowany sposób tworzenia klientów gRPC.gRPC integration with HttpClientFactory offers a centralized way to create gRPC clients. Może służyć jako alternatywa do konfigurowania autonomicznych wystąpień klienta gRPC.It can be used as an alternative to configuring stand-alone gRPC client instances. Integracja z fabryką jest dostępna w pakiecie NuGet GRPC .NET. ClientFactory .Factory integration is available in the Grpc.Net.ClientFactory NuGet package.

Fabryka oferuje następujące korzyści:The factory offers the following benefits:

  • Zapewnia centralną lokalizację do konfigurowania wystąpień klienta logicznego gRPCProvides a central location for configuring logical gRPC client instances
  • Zarządza okresem istnienia bazowego HttpClientMessageHandlerManages the lifetime of the underlying HttpClientMessageHandler
  • Automatyczne propagowanie terminu ostatecznego i anulowanie w ASP.NET Core usłudze gRPCAutomatic propagation of deadline and cancellation in an ASP.NET Core gRPC service

Rejestrowanie klientów gRPCRegister gRPC clients

W celu zarejestrowania klienta gRPC AddGrpcClient można użyć metody rozszerzenia generycznego w programie Startup.ConfigureServices , określając klasę klienta z określonym gRPC i adres usługi: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:

services.AddGrpcClient<Greeter.GreeterClient>(o =>
{
    o.Address = new Uri("https://localhost:5001");
});

Typ klienta gRPC jest rejestrowany jako przejściowy z iniekcją zależności (DI).The gRPC client type is registered as transient with dependency injection (DI). Klient może teraz zostać dodany i wykorzystany bezpośrednio w typach utworzonych przez DI.The client can now be injected and consumed directly in types created by DI. ASP.NET Core kontrolery MVC, SignalR centra i usługi gRPC są umieszczane w miejscach, w których można automatycznie dodawać klientów gRPC:ASP.NET Core MVC controllers, SignalR hubs and gRPC services are places where gRPC clients can automatically be injected:

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<HelloReply> 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);
            }
        }
    }
}

Konfigurowanie HttpClientConfigure HttpClient

HttpClientFactory tworzy HttpClient używany przez klienta gRPC.HttpClientFactory creates the HttpClient used by the gRPC client. HttpClientFactoryPrzy użyciu metod standardowych można dodać wychodzące oprogramowanie pośredniczące lub skonfigurować podstawową HttpClientHandler wartość HttpClient :Standard HttpClientFactory methods can be used to add outgoing request middleware or to configure the underlying HttpClientHandler of the HttpClient:

services
    .AddGrpcClient<Greeter.GreeterClient>(o =>
    {
        o.Address = new Uri("https://localhost:5001");
    })
    .ConfigurePrimaryHttpMessageHandler(() =>
    {
        var handler = new HttpClientHandler();
        handler.ClientCertificates.Add(LoadCertificate());
        return handler;
    });

Aby uzyskać więcej informacji, zobacz Tworzenie żądań HTTP przy użyciu IHttpClientFactory.For more information, see Make HTTP requests using IHttpClientFactory.

Konfigurowanie kanałów i przechwyceńConfigure Channel and Interceptors

metody specyficzne dla gRPC są dostępne dla:gRPC-specific methods are available to:

  • Skonfiguruj kanał bazowy klienta gRPC.Configure a gRPC client's underlying channel.
  • Dodaj Interceptor wystąpienia, które będą używane przez klienta podczas wykonywania wywołań gRPC.Add Interceptor instances that the client will use when making gRPC calls.
services
    .AddGrpcClient<Greeter.GreeterClient>(o =>
    {
        o.Address = new Uri("https://localhost:5001");
    })
    .AddInterceptor(() => new LoggingInterceptor())
    .ConfigureChannel(o =>
    {
        o.Credentials = new CustomCredentials();
    });

Termin ostateczny i Propagacja anulowaniaDeadline and cancellation propagation

klientów gRPC utworzonych przez fabrykę w usłudze gRPC można skonfigurować w EnableCallContextPropagation() celu automatycznego propagowania terminu ostatecznego i tokenu anulowania do wywołań podrzędnych.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. EnableCallContextPropagation()Metoda rozszerzenia jest dostępna w pakiecie NuGet GRPC. AspNetCore. Server. ClientFactory .The EnableCallContextPropagation() extension method is available in the Grpc.AspNetCore.Server.ClientFactory NuGet package.

Propagacja kontekstu wywołania działa, odczytując termin ostateczny i token anulowania z bieżącego kontekstu żądania gRPC i automatycznie propaguje je do wywołań wychodzących wykonywanych przez klienta gRPC.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. Propagacja kontekstu wywołania jest doskonałym sposobem zapewnienia, że złożone, zagnieżdżone scenariusze gRPC zawsze propagują termin i anulowanie.Call context propagation is an excellent way of ensuring that complex, nested gRPC scenarios always propagate the deadline and cancellation.

services
    .AddGrpcClient<Greeter.GreeterClient>(o =>
    {
        o.Address = new Uri("https://localhost:5001");
    })
    .EnableCallContextPropagation();

Domyślnie program EnableCallContextPropagation zgłasza błąd, jeśli klient jest używany poza kontekstem wywołania gRPC.By default, EnableCallContextPropagation raises an error if the client is used outside the context of a gRPC call. Ten błąd jest przeznaczony do powiadamiania o braku kontekstu wywołania do propagacji.The error is designed to alert you that there isn't a call context to propagate. Jeśli klient ma być używany poza kontekstem wywołania, należy pominąć błąd, gdy klient jest skonfigurowany przy użyciu SuppressContextNotFoundErrors :If you want to use the client outside of a call context, suppress the error when the client is configured with SuppressContextNotFoundErrors:

services
    .AddGrpcClient<Greeter.GreeterClient>(o =>
    {
        o.Address = new Uri("https://localhost:5001");
    })
    .EnableCallContextPropagation(o => o.SuppressContextNotFoundErrors = true);

Aby uzyskać więcej informacji na temat terminów i anulowania wywołania RPC, zobacz cykl życia usługi RPC.For more information about deadlines and RPC cancellation, see RPC life cycle.

Dodatkowe zasobyAdditional resources