Nguon: Microsoft Learn · .NET 8.0

Cấu hình gRPC cho .NET

Nguồn: gRPC for .NET configuration

Cấu hình tùy chọn dịch vụ

Các dịch vụ gRPC được cấu hình bằng AddGrpc trong Startup.cs. Các tùy chọn cấu hình nằm trong gói Grpc.AspNetCore.Server.

Bảng sau mô tả các tùy chọn để cấu hình dịch vụ gRPC:

Tùy chọnGiá trị mặc địnhMô tả
MaxSendMessageSizenullKích thước thông điệp tối đa (tính bằng byte) có thể được gửi từ server. Cố gắng gửi thông điệp vượt quá kích thước tối đa đã cấu hình sẽ dẫn đến ngoại lệ (exception). Khi đặt thành null, kích thước thông điệp không giới hạn.
MaxReceiveMessageSize4 MBKích thước thông điệp tối đa (tính bằng byte) mà server có thể nhận. Nếu server nhận được thông điệp vượt quá giới hạn này, nó sẽ ném ra ngoại lệ. Tăng giá trị này cho phép server nhận thông điệp lớn hơn, nhưng có thể ảnh hưởng tiêu cực đến mức tiêu thụ bộ nhớ. Khi đặt thành null, kích thước thông điệp không giới hạn.
EnableDetailedErrorsfalseNếu là true, các thông báo ngoại lệ chi tiết sẽ được trả về cho client khi ngoại lệ xảy ra trong phương thức dịch vụ. Mặc định là false. Đặt EnableDetailedErrors thành true có thể làm lộ thông tin nhạy cảm.
CompressionProvidersgzipMột tập hợp các nhà cung cấp nén (compression providers) dùng để nén và giải nén thông điệp. Có thể tạo và thêm nhà cung cấp nén tùy chỉnh vào tập hợp. Các nhà cung cấp được cấu hình mặc định hỗ trợ nén gzip.
ResponseCompressionAlgorithmnullThuật toán nén dùng để nén thông điệp gửi từ server. Thuật toán phải khớp với một nhà cung cấp nén trong CompressionProviders. Để thuật toán nén phản hồi, client phải chỉ ra rằng nó hỗ trợ thuật toán đó bằng cách gửi nó trong header grpc-accept-encoding.
ResponseCompressionLevelnullMức nén dùng để nén thông điệp gửi từ server.
InterceptorsKhông cóMột tập hợp các interceptor (bộ chặn) được chạy với mỗi lời gọi gRPC. Các interceptor được chạy theo thứ tự chúng được đăng ký. Các interceptor được cấu hình toàn cục chạy trước các interceptor được cấu hình cho một dịch vụ cụ thể. Theo mặc định, các interceptor có vòng đời theo từng yêu cầu (per-request lifetime). Constructor của interceptor được gọi và các tham số được giải quyết từ dependency injection (DI). Loại interceptor cũng có thể được đăng ký với DI để ghi đè cách tạo và vòng đời của nó. Interceptor cung cấp các chức năng tương tự so với ASP.NET Core middleware.
IgnoreUnknownServicesfalseNếu là true, các lời gọi đến dịch vụ và phương thức không xác định sẽ không trả về trạng thái UNIMPLEMENTED, và yêu cầu được chuyển đến middleware tiếp theo đã đăng ký trong ASP.NET Core.

Các tùy chọn có thể được cấu hình cho tất cả dịch vụ bằng cách cung cấp một delegate tùy chọn cho lời gọi AddGrpc trong Startup.ConfigureServices:

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

Các tùy chọn cho một dịch vụ đơn lẻ ghi đè các tùy chọn toàn cục được cung cấp trong AddGrpc và có thể được cấu hình bằng AddServiceOptions<TService>:

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

Các interceptor dịch vụ có vòng đời theo từng yêu cầu theo mặc định. Đăng ký loại interceptor với DI sẽ ghi đè cách tạo và vòng đời của interceptor.

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

Tùy chọn server ASP.NET Core

Grpc.AspNetCore.Server được lưu trữ bởi web server ASP.NET Core. Có một số tùy chọn cho các server ASP.NET Core, bao gồm Kestrel, IIS và HTTP.sys. Mỗi server cung cấp các tùy chọn bổ sung cho cách phục vụ các yêu cầu HTTP.

Server được sử dụng bởi ứng dụng ASP.NET Core được cấu hình trong code khởi động ứng dụng. Server mặc định là Kestrel.

Để biết thêm thông tin về các server khác nhau và tùy chọn cấu hình của chúng, xem:

Cấu hình tùy chọn client

Cấu hình client gRPC được đặt trên GrpcChannelOptions. Các tùy chọn cấu hình nằm trong gói Grpc.Net.Client.

Bảng sau mô tả các tùy chọn để cấu hình các kênh (channels) gRPC:

Tùy chọnGiá trị mặc địnhMô tả
HttpHandlerInstance mớiHttpMessageHandler dùng để thực hiện các lời gọi gRPC. Một client có thể được cấu hình để dùng HttpClientHandler tùy chỉnh hoặc thêm các handler bổ sung vào pipeline HTTP cho các lời gọi gRPC.
HttpClientnullHttpClient dùng để thực hiện các lời gọi gRPC. Cài đặt này là một lựa chọn thay thế cho HttpHandler.
DisposeHttpClientfalseNếu đặt thành true và một HttpMessageHandler hoặc HttpClient được chỉ định, thì HttpHandler hoặc HttpClient sẽ bị xử lý khi GrpcChannel bị xử lý.
LoggerFactorynullLoggerFactory được client dùng để ghi log thông tin về các lời gọi gRPC.
MaxSendMessageSizenullKích thước thông điệp tối đa (tính bằng byte) có thể được gửi từ client.
MaxReceiveMessageSize4 MBKích thước thông điệp tối đa (tính bằng byte) mà client có thể nhận.
CredentialsnullMột instance ChannelCredentials. Credentials được dùng để thêm metadata xác thực vào các lời gọi gRPC.
CompressionProvidersgzipMột tập hợp các nhà cung cấp nén dùng để nén và giải nén thông điệp.
ThrowOperationCanceledOnCancellationfalseNếu đặt thành true, client ném ra OperationCanceledException khi một lời gọi bị hủy hoặc deadline bị vượt quá.
UnsafeUseInsecureChannelCallCredentialsfalseNếu đặt thành true, CallCredentials được áp dụng cho các lời gọi gRPC được thực hiện bởi kênh không an toàn (insecure channel).
MaxRetryAttempts5Số lần thử lại tối đa.
MaxRetryBufferSize16 MBKích thước buffer tối đa (tính bằng byte) có thể dùng để lưu trữ các thông điệp đã gửi khi thử lại hoặc hedging calls.
MaxRetryBufferPerCallSize1 MBKích thước buffer tối đa (tính bằng byte) có thể dùng để lưu trữ các thông điệp đã gửi cho mỗi lời gọi khi thử lại.
ServiceConfignullCấu hình dịch vụ cho kênh gRPC.

Đoạn code sau:

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

Lưu ý rằng các interceptor client không được cấu hình bằng GrpcChannelOptions. Thay vào đó, các interceptor client được cấu hình bằng phương thức mở rộng Intercept với một kênh. Phương thức mở rộng này nằm trong namespace Grpc.Core.Interceptors.

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

Tùy chọn handler System.Net

Grpc.Net.Client sử dụng HTTP transport được dẫn xuất từ HttpMessageHandler để thực hiện các yêu cầu HTTP. Mỗi handler cung cấp các tùy chọn bổ sung cho cách thực hiện các yêu cầu HTTP.

Handler được cấu hình trên kênh và có thể được ghi đè bằng cách đặt GrpcChannelOptions.HttpHandler. .NET Core 3 và .NET 5 trở lên sử dụng SocketsHttpHandler theo mặc định. Các ứng dụng gRPC client trên .NET Framework nên cấu hình WinHttpHandler.

Để biết thêm thông tin về các handler khác nhau và tùy chọn cấu hình của chúng, xem: