Integrace objektu pro vytváření klienta gRPC v .NET
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Důležité
Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Autor: James Newton-King
Integrace gRPC s HttpClientFactory
nabídkou centralizovaného způsobu vytváření klientů gRPC. Dá se použít jako alternativa ke konfiguraci samostatných instancí klienta gRPC. Integrace továrny je k dispozici v balíčku NuGet Grpc.Net.ClientFactory .
Továrna nabízí následující výhody:
- Poskytuje centrální umístění pro konfiguraci logických instancí klienta gRPC.
- Spravuje životnost podkladového
HttpClientMessageHandler
objektu . - Automatické šíření termínu a zrušení ve službě ASP.NET Core gRPC.
Registrace klientů gRPC
Chcete-li zaregistrovat klienta gRPC, lze obecnou AddGrpcClient
metodu rozšíření použít v instanci vstupního WebApplicationBuilder bodu aplikace v Program.cs
, určení třídy klienta a adresy služby typu gRPC:
builder.Services.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
});
Typ klienta gRPC je registrován jako přechodný pomocí injektáže závislostí (DI). Klient se teď dá vloženého a spotřebovávat přímo v typech vytvořených pomocí DI. ASP.NET řadičů Core MVC, rozbočovačů a služeb gRPC jsou místa, SignalR kde je možné klienty gRPC automaticky vloženého:
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);
}
}
}
}
Konfigurace obslužné rutiny Http
HttpClientFactory
HttpMessageHandler
vytvoří použitou klientem gRPC. Standardní HttpClientFactory
metody lze použít k přidání middlewaru odchozích požadavků nebo ke konfiguraci podkladového HttpClient
příkazuHttpClientHandler
:
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.ConfigurePrimaryHttpMessageHandler(() =>
{
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(LoadCertificate());
return handler;
});
Další informace najdete v tématu Vytváření požadavků HTTP pomocí IHttpClientFactory.
Konfigurace průsečíků
Průsečíky gRPC je možné přidat do klientů pomocí AddInterceptor
metody.
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.AddInterceptor<LoggingInterceptor>();
Předchozí kód:
- Zaregistruje
GreeterClient
typ. - Nakonfiguruje
LoggingInterceptor
pro tohoto klienta.LoggingInterceptor
se vytvoří jednou a sdílí se meziGreeterClient
instancemi.
Ve výchozím nastavení se průsečík vytvoří jednou a sdílí se mezi klienty. Toto chování lze přepsat zadáním oboru při registraci průsečíku. Klientská továrna lze nakonfigurovat tak, aby pro každého klienta vytvořila nový průsečík zadáním InterceptorScope.Client
.
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.AddInterceptor<LoggingInterceptor>(InterceptorScope.Client);
Vytváření průsečíků s vymezeným oborem klienta je užitečné, když průsečík vyžaduje omezené nebo přechodné služby s vymezeným oborem z DI.
Přihlašovací údaje zachytávání gRPC nebo kanálu se dají použít k odesílání Authorization
metadat s každou žádostí. Další informace o konfiguraci ověřování najdete v tématu Odeslání nosný token pomocí klientské továrny gRPC.
Konfigurace kanálu
Další konfiguraci lze použít na kanál pomocí ConfigureChannel
této metody:
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.ConfigureChannel(o =>
{
o.Credentials = new CustomCredentials();
});
ConfigureChannel
je předána GrpcChannelOptions
instance. Další informace najdete v tématu Konfigurace možností klienta.
Poznámka:
Některé vlastnosti jsou nastavené GrpcChannelOptions
před spuštěním zpětného ConfigureChannel
volání:
HttpHandler
je nastaven na výsledek z ConfigurePrimaryHttpMessageHandler.LoggerFactory
je nastavená na ILoggerFactory vyřešenou hodnotu z DI.
Tyto hodnoty lze přepsat .ConfigureChannel
Přihlašovací údaje volání
Ověřovací hlavičku lze přidat do volání gRPC pomocí AddCallCredentials
metody:
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.AddCallCredentials((context, metadata) =>
{
if (!string.IsNullOrEmpty(_token))
{
metadata.Add("Authorization", $"Bearer {_token}");
}
return Task.CompletedTask;
});
Další informace o konfiguraci přihlašovacích údajů volání najdete v tématu Nosný token s klientskou továrnou gRPC.
Konečný termín a šíření zrušení
Klienti gRPC vytvořená továrnou ve službě gRPC je možné nakonfigurovat tak EnableCallContextPropagation()
, aby automaticky rozšířili konečný termín a token zrušení do podřízených volání. Metoda EnableCallContextPropagation()
rozšíření je k dispozici v balíčku NuGet Grpc.AspNetCore.Server.ClientFactory .
Šíření kontextu volání funguje tak, že čte konečný termín a token zrušení z aktuálního kontextu požadavku gRPC a automaticky je rozšíří do odchozích volání provedených klientem gRPC. Šíření kontextu volání je vynikající způsob, jak zajistit, aby složité a vnořené scénáře gRPC vždy šířily termín a zrušení.
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.EnableCallContextPropagation();
Ve výchozím nastavení vyvolá chybu, EnableCallContextPropagation
pokud se klient používá mimo kontext volání gRPC. Tato chyba je navržená tak, aby vás upozornila, že neexistuje kontext volání, který se má rozšířit. Pokud chcete použít klienta mimo kontext volání, potlačit chybu, pokud je klient nakonfigurován pomocí SuppressContextNotFoundErrors
:
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.EnableCallContextPropagation(o => o.SuppressContextNotFoundErrors = true);
Další informace o termínech a zrušení RPC najdete v tématu Spolehlivé služby gRPC s termíny a zrušením.
Pojmenovaní klienti
Typ klienta gRPC se obvykle zaregistruje jednou a pak se vloží přímo do konstruktoru typu pomocí DI. Existují však scénáře, ve kterých je užitečné mít více konfigurací pro jednoho klienta. Například klient, který provádí volání gRPC s ověřováním i bez ověřování.
Více klientů se stejným typem je možné zaregistrovat tak, že každému klientovi poskytnete název. Každý pojmenovaný klient může mít vlastní konfiguraci. AddGrpcClient
Obecná rozšiřující metoda má přetížení, které zahrnuje parametr name:
builder.Services
.AddGrpcClient<Greeter.GreeterClient>("Greeter", o =>
{
o.Address = new Uri("https://localhost:5001");
});
builder.Services
.AddGrpcClient<Greeter.GreeterClient>("GreeterAuthenticated", o =>
{
o.Address = new Uri("https://localhost:5001");
})
.ConfigureChannel(o =>
{
o.Credentials = new CustomCredentials();
});
Předchozí kód:
- Zaregistruje
GreeterClient
typ dvakrát a zadá jedinečný název pro každý z nich. - Konfiguruje různá nastavení pro každého pojmenovaného klienta. Registrace
GreeterAuthenticated
přidá přihlašovací údaje do kanálu, aby se ověřila volání gRPC.
Pojmenovaný klient gRPC se vytvoří v kódu aplikace pomocí GrpcClientFactory
. Typ a název požadovaného klienta se zadává pomocí obecné GrpcClientFactory.CreateClient
metody:
public class AggregatorService : Aggregator.AggregatorBase
{
private readonly Greeter.GreeterClient _client;
public AggregatorService(GrpcClientFactory grpcClientFactory)
{
_client = grpcClientFactory.CreateClient<Greeter.GreeterClient>("GreeterAuthenticated");
}
}
Další materiály
Integrace gRPC s HttpClientFactory
nabídkou centralizovaného způsobu vytváření klientů gRPC. Dá se použít jako alternativa ke konfiguraci samostatných instancí klienta gRPC. Integrace továrny je k dispozici v balíčku NuGet Grpc.Net.ClientFactory .
Továrna nabízí následující výhody:
- Poskytuje centrální umístění pro konfiguraci logických instancí klienta gRPC.
- Spravuje životnost podkladového objektu.
HttpClientMessageHandler
- Automatické šíření termínu a zrušení ve službě ASP.NET Core gRPC
Registrace klientů gRPC
Chcete-li zaregistrovat klienta gRPC, lze použít obecnou AddGrpcClient
metodu rozšíření v rámci Startup.ConfigureServices
, určení třídy klienta a adresy služby typu gRPC:
services.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
});
Typ klienta gRPC je registrován jako přechodný pomocí injektáže závislostí (DI). Klient se teď dá vloženého a spotřebovávat přímo v typech vytvořených pomocí DI. ASP.NET řadičů Core MVC, rozbočovačů a služeb gRPC jsou místa, SignalR kde je možné klienty gRPC automaticky vloženého:
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);
}
}
}
}
Konfigurace obslužné rutiny Http
HttpClientFactory
HttpMessageHandler
vytvoří použitou klientem gRPC. Standardní HttpClientFactory
metody lze použít k přidání middlewaru odchozích požadavků nebo ke konfiguraci podkladového HttpClient
příkazuHttpClientHandler
:
services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.ConfigurePrimaryHttpMessageHandler(() =>
{
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(LoadCertificate());
return handler;
});
Další informace najdete v tématu Vytváření požadavků HTTP pomocí IHttpClientFactory.
Konfigurace průsečíků
Průsečíky gRPC je možné přidat do klientů pomocí AddInterceptor
metody.
services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.AddInterceptor<LoggingInterceptor>();
Předchozí kód:
- Zaregistruje
GreeterClient
typ. - Nakonfiguruje
LoggingInterceptor
pro tohoto klienta.LoggingInterceptor
se vytvoří jednou a sdílí se meziGreeterClient
instancemi.
Ve výchozím nastavení se průsečík vytvoří jednou a sdílí se mezi klienty. Toto chování lze přepsat zadáním oboru při registraci průsečíku. Klientská továrna lze nakonfigurovat tak, aby pro každého klienta vytvořila nový průsečík zadáním InterceptorScope.Client
.
services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.AddInterceptor<LoggingInterceptor>(InterceptorScope.Client);
Vytváření průsečíků s vymezeným oborem klienta je užitečné, když průsečík vyžaduje omezené nebo přechodné služby s vymezeným oborem z DI.
Přihlašovací údaje zachytávání gRPC nebo kanálu se dají použít k odesílání Authorization
metadat s každou žádostí. Další informace o konfiguraci ověřování najdete v tématu Odeslání nosný token pomocí klientské továrny gRPC.
Konfigurace kanálu
Další konfiguraci lze použít na kanál pomocí ConfigureChannel
této metody:
services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.ConfigureChannel(o =>
{
o.Credentials = new CustomCredentials();
});
ConfigureChannel
je předána GrpcChannelOptions
instance. Další informace najdete v tématu Konfigurace možností klienta.
Poznámka:
Některé vlastnosti jsou nastavené GrpcChannelOptions
před spuštěním zpětného ConfigureChannel
volání:
HttpHandler
je nastaven na výsledek z ConfigurePrimaryHttpMessageHandler.LoggerFactory
je nastavená na ILoggerFactory vyřešenou hodnotu z DI.
Tyto hodnoty lze přepsat .ConfigureChannel
Konečný termín a šíření zrušení
Klienti gRPC vytvořená továrnou ve službě gRPC je možné nakonfigurovat tak EnableCallContextPropagation()
, aby automaticky rozšířili konečný termín a token zrušení do podřízených volání. Metoda EnableCallContextPropagation()
rozšíření je k dispozici v balíčku NuGet Grpc.AspNetCore.Server.ClientFactory .
Šíření kontextu volání funguje tak, že čte konečný termín a token zrušení z aktuálního kontextu požadavku gRPC a automaticky je rozšíří do odchozích volání provedených klientem gRPC. Šíření kontextu volání je vynikající způsob, jak zajistit, aby složité a vnořené scénáře gRPC vždy šířily termín a zrušení.
services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.EnableCallContextPropagation();
Ve výchozím nastavení vyvolá chybu, EnableCallContextPropagation
pokud se klient používá mimo kontext volání gRPC. Tato chyba je navržená tak, aby vás upozornila, že neexistuje kontext volání, který se má rozšířit. Pokud chcete použít klienta mimo kontext volání, potlačit chybu, pokud je klient nakonfigurován pomocí SuppressContextNotFoundErrors
:
services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.EnableCallContextPropagation(o => o.SuppressContextNotFoundErrors = true);
Další informace o termínech a zrušení RPC najdete v tématu Spolehlivé služby gRPC s termíny a zrušením.
Pojmenovaní klienti
Typ klienta gRPC se obvykle zaregistruje jednou a pak se vloží přímo do konstruktoru typu pomocí DI. Existují však scénáře, ve kterých je užitečné mít více konfigurací pro jednoho klienta. Například klient, který provádí volání gRPC s ověřováním i bez ověřování.
Více klientů se stejným typem je možné zaregistrovat tak, že každému klientovi poskytnete název. Každý pojmenovaný klient může mít vlastní konfiguraci. AddGrpcClient
Obecná rozšiřující metoda má přetížení, které zahrnuje parametr name:
services
.AddGrpcClient<Greeter.GreeterClient>("Greeter", o =>
{
o.Address = new Uri("https://localhost:5001");
});
services
.AddGrpcClient<Greeter.GreeterClient>("GreeterAuthenticated", o =>
{
o.Address = new Uri("https://localhost:5001");
})
.ConfigureChannel(o =>
{
o.Credentials = new CustomCredentials();
});
Předchozí kód:
- Zaregistruje
GreeterClient
typ dvakrát a zadá jedinečný název pro každý z nich. - Konfiguruje různá nastavení pro každého pojmenovaného klienta. Registrace
GreeterAuthenticated
přidá přihlašovací údaje do kanálu, aby se ověřila volání gRPC.
Pojmenovaný klient gRPC se vytvoří v kódu aplikace pomocí GrpcClientFactory
. Typ a název požadovaného klienta se zadává pomocí obecné GrpcClientFactory.CreateClient
metody:
public class AggregatorService : Aggregator.AggregatorBase
{
private readonly Greeter.GreeterClient _client;
public AggregatorService(GrpcClientFactory grpcClientFactory)
{
_client = grpcClientFactory.CreateClient<Greeter.GreeterClient>("GreeterAuthenticated");
}
}