Table of Contents

Struct ZedalCallContext

Namespace
Zedal.Sdk
Assembly
Zedal.Sdk.dll

Bündelt die Aufrufer-Steuerung eines einzelnen API-Calls: Zeitgrenze, CancellationToken und optionale zusätzliche gRPC-Header.

public readonly struct ZedalCallContext
Inherited Members

Examples

// Default-Deadline plus Abbruchmöglichkeit (implizite Konvertierung)
await client.CoreApi.Documents.ExportCurrentDocument(docId, context: token);

// Langläufer ohne Deadline — nur der Token bricht ab
await client.DiwassApi.AttachmentApi.GetAttachment(id,
    ZedalCallContext.Default.WithCancellation(token).WithoutDeadline());

// Großzügige, aber endliche Deadline — Reihenfolge beliebig
await client.DiwassApi.AttachmentApi.GetAttachment(id,
    ZedalCallContext.Default.WithTimeout(600).WithCancellation(token));

Remarks

Deadline und Cancellation sind zwei getrennte Schutzmechanismen und bewusst kombinierbar — was zuerst eintritt, gewinnt. Die Deadline schützt gegen einen Server, der nie antwortet (hängender Peer, half-open TCP); dagegen hilft kein Token, den niemand auslöst. Der Token deckt umgekehrt den Abbruch auf Aufruferwunsch ab (User klickt „Abbrechen", Host fährt herunter). Beide Fälle bleiben für Aufrufer unterscheidbar: eine gerissene Deadline kommt als RpcException mit DeadlineExceeded, ein Abbruch über den Token als OperationCanceledException — dafür sorgt Zedal.Sdk.Impl.CancellationTranslatingInterceptor.

Deshalb hebt ein übergebener Token die Deadline nicht automatisch auf. Wer die Zeitsteuerung vollständig selbst übernehmen will, sagt das explizit über WithoutDeadline() — typischerweise für Langläufer wie Attachment-Up- und -Downloads, die nicht in den 30-Sekunden-Default passen.

Der Default-Wert (default(ZedalCallContext), bzw. Default) verhält sich exakt wie das bisherige Verhalten ohne Kontext: Deadline aus DefaultTimeout, kein Token.

Alle With…-Methoden sind Instanz-Wither: jede liefert eine Kopie, in der genau ein Feld geändert ist, und reicht die übrigen unverändert durch. Die Reihenfolge einer Kette ist deshalb ohne Bedeutung. Einzige Ausnahme ist WithFallbackTimeout(int), das bewusst nur greift, wenn der Aufrufer keine eigene Zeitgrenze gesetzt hat — auch das aber unabhängig davon, ob die Zeitgrenze vor oder nach dem Fallback gesetzt wurde.

Constructors

ZedalCallContext(int, CancellationToken, Metadata)

Initialisiert einen Kontext.

Fields

ClientDefaultTimeout

Timeout-Wert, der auf DefaultTimeout zurückfällt.

NoTimeout

Timeout-Wert, der die Deadline abschaltet. Identisch zu Infinite (-1).

Properties

CancellationToken

Token, mit dem der Aufrufer den laufenden Call abbrechen kann.

Default

Neutraler Ausgangspunkt einer With…-Kette; identisch zu default(ZedalCallContext).

ExtraHeaders

Optionale zusätzliche gRPC-Metadata-Header (z.B. DIWASS-Cache-Steuerung).

TimeoutSeconds

Zeitgrenze in Sekunden. 0 = Client-Default, NoTimeout = keine Deadline.

Methods

ResolveDeadline(int)

Löst die effektive Deadline auf.

WithAdditionalHeaders(Metadata)

Kopie dieses Kontexts, in der additionalHeaders zu den bereits vorhandenen hinzukommen. Bei gleichem Key gewinnt der bestehende Eintrag.

WithCancellation(CancellationToken)

Kopie dieses Kontexts mit gesetztem CancellationToken.

WithExtraHeaders(Metadata)

Kopie dieses Kontexts mit gesetzten Zusatz-Headern. Ersetzt bereits gesetzte Header — für Aufrufer gedacht, die die Header eines Calls bestimmen. Eine SDK-Schicht, die ihre eigenen Header beisteuert, nimmt WithAdditionalHeaders(Metadata).

WithFallbackTimeout(int)

Kopie dieses Kontexts mit timeoutSeconds als Deadline — aber nur, wenn der Aufrufer keine eigene Zeitgrenze gesetzt hat.

WithTimeout(int)

Kopie dieses Kontexts mit expliziter Deadline in Sekunden.

WithoutDeadline()

Kopie dieses Kontexts ohne Deadline — dann ist der CancellationToken die einzige Abbruchbedingung. Für Langläufer (Attachment-Up-/Download, große Exporte), die nicht in den Client-Default passen.

Operators

implicit operator ZedalCallContext(CancellationToken)

Erlaubt es, einen CancellationToken direkt an eine API-Methode zu übergeben, ohne den Kontext explizit zu konstruieren.