پرش به مستندات
C#

خطاها و تلاش دوباره

یک نوع استثنا برای هر رد شدن، یک ویژگی برای هر گونه، و تلاش‌های دوباره‌ای که نمی‌توانند دو بار بفرستند.

رسیدگی به یک خطا

errors.cs
try{    await client.Emails.SendAsync(new Body    {        ["from"] = "[email protected]",        ["to"] = "[email protected]",        ["subject"] = "Your September invoice",        ["text"] = "Invoice attached.",    });}catch (OpenEmailApiException error) when (error.IsValidation){    Console.Error.WriteLine($"{error.Code} {error.Param} {error.Message}");}catch (OpenEmailApiException error) when (error.IsRateLimited){    Console.Error.WriteLine($"try again in {error.RetryAfterSeconds} seconds");}catch (OpenEmailNetworkException error) when (error.IsTimeout){    Console.Error.WriteLine("no answer in time");}

رد شدن از سوی API یک OpenEmailApiException پرتاب می‌کند، و نرسیدن هیچ پاسخی یک OpenEmailNetworkException. هر دو از OpenEmailException مشتق می‌شوند، پس یک catch هر کدام را می‌گیرد، و یک فیلتر when گونه را برمی‌گزیند.

ویژگیمحتوای آن
Statusوضعیت HTTP.
ErrorType, Codeنوع خطا و کد API، مانند validation_error و invalid_parameter.
Paramفیلدی که مقصر است، اگر چنین فیلدی باشد.
RequestIdشناسه‌ای که هنگام نوشتن به پشتیبانی باید ذکر کنید.
DocUrlصفحه‌ای از مستندات که کد را توضیح می‌دهد.
RetryAfterSecondsمدتی که API از شما خواسته صبر کنید، به ثانیه.
Fieldsفیلدهایی که یک فرم ثبت‌نام رد کرده است، هر کدام با یک key و یک error.
Bodyبدنهٔ رمزگشایی‌شدهٔ پاسخ.

گونه‌های شکست

ویژگیچه زمانی درست است
IsAuthکلید یا توکن رد شد، با 401.
IsPermissionاین اعتبارنامه اجازهٔ این کار را ندارد، با 403.
IsScopeMissingاعتبارنامه دامنهٔ دسترسی‌ای را که فراخوانی لازم دارد ندارد.
IsStepUpRequiredتوکن دسترسی باید نخست یک کد را تأیید کند.
IsNotFoundهیچ چیزی آن شناسه را ندارد، با 404.
IsConflictتغییر با وضعیت فعلی ناسازگار است، با 409.
IsValidationیک فیلد رد شد، با 422.
IsRateLimitedدرخواست‌ها بیش از حد است، یا یک سهمیه تمام شده، با 429.
IsInvalidRequestهر رد دیگرِ درخواست.
IsServerErrorAPI شکست خورد، با وضعیت 500 یا بیشتر.
IsRetryableوضعیت از آن‌هایی است که کلاینت دوباره امتحان می‌کند.
IsTimeoutپیش از پایان مهلت هیچ پاسخی نرسید. این یکی روی OpenEmailNetworkException است.

اشتباه در خودِ فراخوانی، مانند کلید بدشکل یا شناسهٔ خالی، پیش از فرستادن هر چیزی ArgumentException پرتاب می‌کند. توکنِ لغوشده OperationCanceledException پرتاب می‌کند، و تحویل وب‌هوکی که در بررسی رد شود OpenEmailWebhookException پرتاب می‌کند.

کد تأیید

توکن دسترسی به‌جای یک شخص عمل می‌کند، پس پیش از یک تغییر حساس، مانند حذف یک دامنه، همان کد تأییدی از آن خواسته می‌شود که برنامهٔ وب می‌خواهد. یک کد درخواست کنید، آن را بررسی کنید، سپس درخواست را دوباره بفرستید. از کلیدهای API هرگز کدی خواسته نمی‌شود.

step-up.cs
var domainId = "b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f"; try{    await client.Domains.DeleteAsync(domainId);}catch (OpenEmailApiException error) when (error.IsStepUpRequired){    var challenge = await client.Security.BeginStepUpAsync();     Console.WriteLine($"Enter the code sent by {challenge["method"]}");     await client.Security.VerifyStepUpAsync(new Body { ["code"] = Console.ReadLine()?.Trim() });    await client.Domains.DeleteAsync(domainId);}

آنچه دوباره امتحان می‌شود

  • خواندن‌ها، ارسال‌ها و هر نوشتنی که تکرارش بی‌خطر است دوباره امتحان می‌شوند، تا MaxRetries بار. هر نوشتن دیگری یک بار فرستاده می‌شود.
  • وضعیت‌های 408، 500، 502، 503 و 504 با انتظاری دوباره امتحان می‌شوند که از نیم ثانیه شروع می‌شود و تا هشت ثانیه دو برابر می‌شود.
  • یک 429 فقط وقتی دوباره امتحان می‌شود که Retry-After یک دقیقه یا کمتر داشته باشد، و کلاینت همان‌قدر صبر می‌کند.
  • اتصالی که شکست بخورد یا مهلتش تمام شود به همین شیوه دوباره امتحان می‌شود.

ارسالی که دوباره امتحان می‌شود هر بار همان کلید یکتایی را دارد، پس API به‌جای فرستادن پیام دوم، پیام نخست را بازپخش می‌کند.