0Pricing
C# Academy · Pelajaran

Batas Waktu, Pembatalan & Interceptor

Terapkan batas waktu dengan deadline, teruskan CancellationToken, dan tambahkan perhatian lintas fungsi melalui interceptor gRPC.

Batas Waktu, Pembatalan & Interceptor adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Keandalan gRPC: Batas Waktu dan Pembatalan

Layanan gRPC produksi harus menangani dua aspek keandalan penting: batas waktu (berapa lama klien akan menunggu) dan pembatalan (menghentikan pekerjaan lebih awal). Keduanya mencegah kehabisan sumber daya dan kegagalan berantai.

Menetapkan Batas Waktu pada Panggilan

Batas waktu adalah titik waktu absolut yang menjadi batas penyelesaian panggilan. Tetapkan dengan CallOptions. Jika terlampaui, server menerima pembatalan dan klien mendapatkan StatusCode.DeadlineExceeded.

var deadline = DateTime.UtcNow.AddSeconds(5);

var reply = await client.GetOrderAsync(
    new GetOrderRequest { Id = 42 },
    deadline: deadline);

// Or via CallOptions:
var options = new CallOptions(deadline: deadline);
var reply2 = await client.GetOrderAsync(
    new GetOrderRequest { Id = 42 }, options);

Menangani DeadlineExceeded di Klien

Tangkap RpcException dan periksa kode status untuk membedakan berakhirnya batas waktu dari kesalahan lainnya.

try
{
    var reply = await client.GetOrderAsync(
        new GetOrderRequest { Id = 42 },
        deadline: DateTime.UtcNow.AddSeconds(3));
}
catch (RpcException ex) when (ex.StatusCode == StatusCode.DeadlineExceeded)
{
    Console.WriteLine("Call timed out");
}
catch (RpcException ex)
{
    Console.WriteLine($"gRPC error: {ex.Status.Detail}");
}

Mematuhi Batas Waktu di Server

Server sebaiknya memeriksa context.CancellationToken selama pekerjaan yang berlangsung lama. Saat batas waktu terlewati, token ini dibatalkan secara otomatis.

public override async Task<ReportResponse> GenerateReport(
    ReportRequest request,
    ServerCallContext context)
{
    var ct = context.CancellationToken;

    // Pass ct to every async call — work stops when deadline hits
    var data = await _db.FetchLargeDatasetAsync(request.Filters, ct);
    var report = await _reportEngine.BuildAsync(data, ct);

    ct.ThrowIfCancellationRequested(); // explicit check before CPU work
    return MapToResponse(report);
}

Meneruskan CancellationToken

Selalu teruskan CancellationToken milik server melalui setiap rantai panggilan async. Jika diabaikan, panggilan yang dibatalkan akan terus menggunakan sumber daya tanpa perlu.

// GOOD: token flows through the call chain
await _db.Products.AsNoTracking()
    .Where(p => p.IsActive)
    .ToListAsync(context.CancellationToken); // cancels if client disconnects

// BAD: ignores cancellation
await _db.Products.ToListAsync(); // keeps running after deadline

Pencegat gRPC: Konsep

Pencegat adalah padanan perangkat tengah ASP.NET Core dalam gRPC — pencegat berjalan sebelum atau sesudah panggilan RPC dan dapat memeriksa atau mengubah permintaan, respons, serta pengecualian. Pencegat ideal untuk pencatatan log, autentikasi, dan logika percobaan ulang.

Membuat Pencegat Sisi Server

Turunkan kelas dari Interceptor dan ganti jenis metode yang ingin Anda cegat. Panggil continuation untuk melanjutkan ke handler sebenarnya.

using Grpc.Core.Interceptors;

public class LoggingInterceptor : Interceptor
{
    private readonly ILogger<LoggingInterceptor> _logger;
    public LoggingInterceptor(ILogger<LoggingInterceptor> l) => _logger = l;

    public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(
        TRequest request,
        ServerCallContext context,
        UnaryServerMethod<TRequest, TResponse> continuation)
    {
        _logger.LogInformation("gRPC call: {Method}", context.Method);
        var sw = System.Diagnostics.Stopwatch.StartNew();
        var response = await continuation(request, context);
        _logger.LogInformation("Completed in {Ms}ms", sw.ElapsedMilliseconds);
        return response;
    }
}

Mendaftarkan Pencegat di Server

Daftarkan pencegat secara global (semua layanan) atau per layanan dalam Program.cs. Wadah DI menyelesaikan dependensi konstruktor.

// Globally for all gRPC services:
builder.Services.AddGrpc(opt =>
    opt.Interceptors.Add<LoggingInterceptor>());

// Or per service:
builder.Services.AddGrpc();
builder.Services.AddSingleton<LoggingInterceptor>();

app.MapGrpcService<OrderService>()
   .AddInterceptor<LoggingInterceptor>();

Pencegat Sisi Klien

Pencegat klien membungkus panggilan keluar — berguna untuk menambahkan header autentikasi, logika percobaan ulang, atau ID korelasi tanpa mengubah setiap titik pemanggilan.

public class AuthInterceptor : Interceptor
{
    private readonly ITokenProvider _tokens;
    public AuthInterceptor(ITokenProvider t) => _tokens = t;

    public override AsyncUnaryCall<TResponse> AsyncUnaryCall<TRequest, TResponse>(
        TRequest request,
        ClientInterceptorContext<TRequest, TResponse> context,
        AsyncUnaryCallContinuation<TRequest, TResponse> continuation)
    {
        var headers = context.Options.Headers ?? new Metadata();
        headers.Add("authorization", $"Bearer {_tokens.GetToken()}");
        var newContext = new ClientInterceptorContext<TRequest, TResponse>(
            context.Method, context.Host,
            context.Options.WithHeaders(headers));
        return continuation(request, newContext);
    }
}

// Attach to channel:
var invoker = channel.Intercept(new AuthInterceptor(tokenProvider));
var client = new OrderService.OrderServiceClient(invoker);

Pencegat Pengecualian

Pencegat pengecualian sisi server mengonversi pengecualian yang tidak tertangani menjadi RpcExceptions, sehingga mencegah detail internal bocor ke klien.

public class ExceptionInterceptor : Interceptor
{
    public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(
        TRequest request,
        ServerCallContext context,
        UnaryServerMethod<TRequest, TResponse> continuation)
    {
        try
        {
            return await continuation(request, context);
        }
        catch (NotFoundException ex)
        {
            throw new RpcException(new Status(StatusCode.NotFound, ex.Message));
        }
        catch (Exception ex)
        {
            throw new RpcException(new Status(StatusCode.Internal, "Internal error"));
        }
    }
}

Pemeriksaan Singkat

Apa yang terjadi ketika panggilan gRPC melampaui batas waktunya?

Ringkasan: Batas Waktu, Pembatalan, dan Pencegat

Poin penting:

  • Selalu tetapkan batas waktu pada panggilan klien untuk mencegah penantian tanpa batas
  • Periksa context.CancellationToken di server dan teruskan ke semua panggilan async
  • Pencegat menangani urusan lintas fungsi (pencatatan log, autentikasi, pemetaan kesalahan) tanpa memenuhi kode layanan
  • Pencegat server: ganti metode handler untuk panggilan satu arah atau streaming dan panggil continuation
  • Pencegat klien: pasangkan pada rantai pemanggil channel

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Batas Waktu, Pembatalan & Interceptor” gratis?

Ya — teks lengkap “Batas Waktu, Pembatalan & Interceptor” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Batas Waktu, Pembatalan & Interceptor”?

Terapkan batas waktu dengan deadline, teruskan CancellationToken, dan tambahkan perhatian lintas fungsi melalui interceptor gRPC. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Batas Waktu, Pembatalan & Interceptor” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar gRPC & Protobuf
  2. RPC Unary & Streaming Server
  3. Streaming Klien & Dua Arah
  4. Batas Waktu, Pembatalan & Interceptor
← Kembali ke C# Academy