configurazione di gRPC per .NET

Configurare le opzioni dei servizi

I servizi gRPC sono configurati con AddGrpc in Startup.cs. Le opzioni di configurazione si trovano nel Grpc.AspNetCore.Server pacchetto.

La tabella seguente descrive le opzioni per la configurazione dei servizi gRPC:

Opzione Valore predefinito Descrizione
MaxSendMessageSize null Dimensione massima dei messaggi in byte che è possibile inviare dal server. Se si tenta di inviare un messaggio che supera la dimensione massima configurata del messaggio, viene generata un'eccezione. Se impostato su null, la dimensione del messaggio è illimitata.
MaxReceiveMessageSize 4 MB Dimensione massima dei messaggi in byte che è possibile ricevere dal server. Se il server riceve un messaggio che supera questo limite, genera un'eccezione. L'aumento di questo valore consente al server di ricevere messaggi di dimensioni maggiori, ma può influire negativamente sull'utilizzo della memoria. Se impostato su null, la dimensione del messaggio è illimitata.
EnableDetailedErrors false Se true, i messaggi di eccezione dettagliati vengono restituiti ai client quando viene generata un'eccezione in un metodo del servizio. Il valore predefinito è false. L'impostazione EnableDetailedErrors su true può causare la perdita di informazioni riservate.
CompressionProviders gzip Raccolta di provider di compressione utilizzati per comprimere e decomprimere i messaggi. I provider di compressione personalizzati possono essere creati e aggiunti alla raccolta. I provider configurati predefiniti supportano la compressione gzip .
ResponseCompressionAlgorithm null Algoritmo di compressione utilizzato per comprimere i messaggi inviati dal server. L'algoritmo deve corrispondere a un provider di compressione in CompressionProviders. Affinché l'algoritmo comprima una risposta, il client deve indicare che supporta l'algoritmo inviandolo nell'intestazione grpc-accept-encoding .
ResponseCompressionLevel null Livello di compressione utilizzato per comprimere i messaggi inviati dal server.
Interceptors None Raccolta di intercettori eseguiti con ogni chiamata gRPC. Gli intercettori vengono eseguiti nell'ordine in cui sono registrati. Gli intercettori configurati a livello globale vengono eseguiti prima che gli intercettori configurati per un singolo servizio.

Per impostazione predefinita, gli intercettori hanno una durata per richiesta. Il costruttore dell'intercettore viene chiamato e i parametri vengono risolti dall'inserimento delle dipendenze . Un tipo di intercettore può anche essere registrato con l'inserimento delle dipendenze per eseguire l'override della modalità di creazione e della relativa durata.

Gli intercettori offrono funzionalità simili rispetto a ASP.NET middleware Core. Per altre informazioni, vedere gRPC Interceptors vs. Middleware.
IgnoreUnknownServices false Se true, le chiamate a servizi e metodi sconosciuti non restituiscono uno stato UNIMPLEMENTED e la richiesta passa al middleware registrato successivo in ASP.NET Core.

Le opzioni possono essere configurate per tutti i servizi fornendo un delegato di opzioni alla AddGrpc chiamata in Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.EnableDetailedErrors = true;
        options.MaxReceiveMessageSize = 2 * 1024 * 1024; // 2 MB
        options.MaxSendMessageSize = 5 * 1024 * 1024; // 5 MB
    });
}

Le opzioni per un singolo servizio eseguono l'override delle opzioni globali disponibili in AddGrpc e possono essere configurate usando AddServiceOptions<TService>:

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc().AddServiceOptions<MyService>(options =>
    {
        options.MaxReceiveMessageSize = 2 * 1024 * 1024; // 2 MB
        options.MaxSendMessageSize = 5 * 1024 * 1024; // 5 MB
    });
}

Per impostazione predefinita, gli intercettori di servizi hanno una durata per richiesta. La registrazione del tipo di intercettore con l'inserimento delle dipendenze esegue l'override del modo in cui viene creato un intercettore e la relativa durata.

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.Interceptors.Add<LoggingInterceptor>();
    });
    services.AddSingleton<LoggingInterceptor>();
}

ASP.NET opzioni del server Core

Grpc.AspNetCore.Server è ospitato da un server Web ASP.NET Core. Sono disponibili diverse opzioni per ASP.NET Server Core, tra cui Kestrel, IIS e HTTP.sys. Ogni server offre opzioni aggiuntive per la modalità di gestione delle richieste HTTP.

Il server usato da un'app ASP.NET Core è configurato nel codice di avvio dell'app. Il server predefinito è Kestrel.

Per altre informazioni sui diversi server e sulle relative opzioni di configurazione, vedere:

Configurare le opzioni client

La configurazione del client gRPC è impostata su GrpcChannelOptions. Le opzioni di configurazione si trovano nel Grpc.Net.Client pacchetto.

La tabella seguente descrive le opzioni per la configurazione dei canali gRPC:

Opzione Valore predefinito Descrizione
HttpHandler Nuova istanza Oggetto HttpMessageHandler utilizzato per effettuare chiamate gRPC. Un client può essere impostato per configurare un gestore personalizzato HttpClientHandler o aggiungere altri gestori alla pipeline HTTP per le chiamate gRPC. Se non viene specificato alcun valore HttpMessageHandler , viene creata una nuova HttpClientHandler istanza per il canale con eliminazione automatica.
HttpClient null Oggetto HttpClient utilizzato per effettuare chiamate gRPC. Questa impostazione è un'alternativa a HttpHandler.
DisposeHttpClient false Se è impostato su true e viene specificato un HttpMessageHandler oggetto o HttpClient , rispettivamente l'oggetto HttpHandler o HttpClientviene eliminato quando viene GrpcChannel eliminato .
LoggerFactory null Oggetto LoggerFactory utilizzato dal client per registrare informazioni sulle chiamate gRPC. Un'istanza LoggerFactory di può essere risolta dall'inserimento delle dipendenze o creata tramite LoggerFactory.Create. Per esempi di configurazione della registrazione, vedere Registrazione e diagnostica in gRPC in .NET.
MaxSendMessageSize null Dimensione massima del messaggio in byte che può essere inviata dal client. Se si tenta di inviare un messaggio che supera la dimensione massima configurata del messaggio, viene generata un'eccezione. Se impostato su null, la dimensione del messaggio è illimitata.
MaxReceiveMessageSize 4 MB Dimensione massima del messaggio in byte che può essere ricevuta dal client. Se il client riceve un messaggio che supera questo limite, genera un'eccezione. L'aumento di questo valore consente al client di ricevere messaggi più grandi, ma può influire negativamente sull'utilizzo della memoria. Se impostato su null, la dimensione del messaggio è illimitata.
Credentials null Istanza di ChannelCredentials. Le credenziali vengono usate per aggiungere metadati di autenticazione alle chiamate gRPC.
CompressionProviders gzip Raccolta di provider di compressione utilizzati per comprimere e decomprimere i messaggi. I provider di compressione personalizzati possono essere creati e aggiunti alla raccolta. I provider configurati predefiniti supportano la compressione gzip .
ThrowOperationCanceledOnCancellation false Se impostato su true, i client generano un'eccezione OperationCanceledException quando una chiamata viene annullata o la scadenza viene superata.
UnsafeUseInsecureChannelCallCredentials false Se impostato su true, CallCredentials vengono applicate alle chiamate gRPC effettuate da un canale non sicuro. L'invio di intestazioni di autenticazione tramite una connessione non sicura ha implicazioni per la sicurezza e non deve essere eseguita negli ambienti di produzione.
MaxRetryAttempts 5 Numero massimo di tentativi. Questo valore limita i valori di tentativi e di hedging specificati nella configurazione del servizio. L'impostazione di questo valore da solo non abilita i tentativi. I tentativi sono abilitati nella configurazione del servizio, operazione che può essere eseguita usando ServiceConfig. Un null valore rimuove il limite massimo di tentativi. Per altre informazioni sui tentativi, vedere Gestione degli errori temporanei con tentativi gRPC.
MaxRetryBufferSize 16 MB Dimensione massima del buffer in byte che può essere usata per archiviare i messaggi inviati durante i tentativi o l'hedging delle chiamate. Se viene superato il limite di buffer, non vengono eseguiti altri tentativi e tutte le chiamate di hedging, ma ne verrà annullata una. Questo limite viene applicato a tutte le chiamate effettuate tramite il canale. Un null valore rimuove il limite massimo di dimensioni del buffer di ripetizione dei tentativi.
MaxRetryBufferPerCallSize 1 MB Dimensione massima del buffer in byte che può essere usata per archiviare i messaggi inviati durante i tentativi o l'hedging delle chiamate. Se viene superato il limite di buffer, non vengono eseguiti altri tentativi e tutte le chiamate di hedging, ma ne verrà annullata una. Questo limite viene applicato a una chiamata. Un null valore rimuove il limite massimo di dimensioni del buffer di ripetizione dei tentativi per ogni chiamata.
ServiceConfig null Configurazione del servizio per un canale gRPC. Una configurazione del servizio può essere usata per configurare i tentativi gRPC.

Il codice seguente:

  • Imposta la dimensione massima del messaggio di invio e ricezione nel canale.
  • Crea un client.
static async Task Main(string[] args)
{
    var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
    {
        MaxReceiveMessageSize = 5 * 1024 * 1024, // 5 MB
        MaxSendMessageSize = 2 * 1024 * 1024 // 2 MB
    });
    var client = new Greeter.GreeterClient(channel);

    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
}

Si noti che gli intercettori client non sono configurati con GrpcChannelOptions. Gli intercettori client vengono invece configurati usando il Intercept metodo di estensione con un canale. Questo metodo di estensione si trova nello spazio dei Grpc.Core.Interceptors nomi .

static async Task Main(string[] args)
{
    var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var callInvoker = channel.Intercept(new LoggingInterceptor());
    var client = new Greeter.GreeterClient(callInvoker);

    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
}

opzioni del gestore System.Net

Grpc.Net.Client usa un trasporto HTTP derivato da HttpMessageHandler per effettuare richieste HTTP. Ogni gestore offre opzioni aggiuntive per il modo in cui vengono effettuate le richieste HTTP.

Il gestore è configurato in un canale e può essere sottoposto a override impostando GrpcChannelOptions.HttpHandler. .NET Core 3 e .NET 5 o versioni successive usano per SocketsHttpHandler impostazione predefinita. Le app client gRPC in .NET Framework devono configurare WinHttpHandler.

Per altre informazioni sui diversi gestori e sulle relative opzioni di configurazione, vedere:

Risorse aggiuntive