عنوان:

‫ملاحظاتی در حین استفاده از IAsyncEnumerable در برنامه‌های وب


نویسنده: وحید نصیری
تاریخ: ۱۴۰۳/۱۲/۱۵ ۰۸:۵۴
آدرس: www.dntips.ir
مشکل: در دات نت 9، بازگرداندن IAsyncEnumerable از یک نقطه پایانی رابط برنامه نویسی وب (Web API) می‌تواند منجر به پاسخ‌های غیرمنتظره و نامعتبر قالب نشانه گذاری اشیاء جاوا اسکریپت (JSON) هنگام بروز خطا در طول شمارش شود. پاسخ غیر معتبر است، زیرا:
      • JSON بازگشتی نامعتبر است — مجموعه بسته نشده‌است.
      • علاوه بر اشیاء بازگشتی، شامل اطلاعات خطا نیز می‌شود.

با این حال، این رفتار در واقع منطقی است. اگر IAsyncEnumerable ارائه شود، طبیعی است که نوشتن آن در جریان (stream) آغاز شود و در حافظه صرفه جویی شود؛ اما هیچ تضمینی وجود ندارد که بازیابی اولین یا صدمین مورد در طول مسیر با خطا مواجه نشود.

بنابراین، مورد من علیه IAsyncEnumerable:
    • باید در استفاده از آن به عنوان مقدار بازگشتی رابط برنامه نویسی کاربردی وب (API) محتاط باشیم.
      • چگونه به مشتری اطلاع دهیم که ممکن است در هر زمان خطایی رخ دهد؟
      • و مشتری چگونه می‌تواند بداند که با مقادیر از قبل دریافت شده چه کند (شاید به عنوان جریان (stream) خوانده شود)؟ آیا باید دور ریخته شوند؟
      • اگر خطایی رخ دهد، آیا راه "صحیحی" برای اطلاع رسانی به مشتری وجود دارد؟ شاید دستورالعمل‌های کاهش خطر ارائه شود. سرآیندها (Headers) از قبل تخلیه شده‌اند. گفتن اینکه فقط آخرین مورد را بخوانید و فرض کنید خطا است، هک به نظر می‌رسد...

app.MapGet("/weather-quiz", async () =>
{
    async IAsyncEnumerable<WeatherForecast> StronglyTypeMe()
    {
        var summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        yield return new WeatherForecast
        (
            DateOnly.FromDateTime(DateTime.Now),
            Random.Shared.Next(-20, 55),
            summaries[Random.Shared.Next(summaries.Length)]
        );

        throw new InvalidOperationException("Failure is always an option"); // BOOM
    }

    return StronglyTypeMe();
});
JSON خروجی
[
    {
        "date":"2025-03-04",
        "temperatureC":-17,
        "summary":"Cool",
        "temperatureF":2
    }
    {
        "type":"https://tools.ietf.org/html/rfc9110#section-15.6.1",
        "title":"An error occurred while processing your request.",
        "status":500
    }
پیامدها:
  • ارائه خروجی JSON نامعتبر: آرایه قالب نشانه گذاری اشیاء جاوا اسکریپت (JSON) به درستی بسته نمی‌شود.
    • پاسخ مبهم: مشتری ترکیبی از داده‌های معتبر و اطلاعات خطا را دریافت می‌کند و مدیریت آن را دشوار می‌کند.
    • مشتری قادر به دانستن اینکه آیا داده های دریافتی از قبل معتبر است یا باید دور ریخته شود نیست.

ملاحظات برای استفاده:
  • نحوه اطلاع رسانی خطاهای احتمالی به مشتری که ممکن است در هر زمانی در طول جریان رخ دهد.
    • نحوه مدیریت داده‌های دریافتی جزئی هنگام بروز خطا.
    • نحوه ارائه اعلان خطای "صحیح"


مشاهده مطلب اصلی