ویرگول
ورودثبت نام
فرهاد صادقی
فرهاد صادقیمهندس نرم افزار، طراحی و راه اندازی سیستم های نرم افزاری بر پایه معماری میکروسرویس
فرهاد صادقی
فرهاد صادقی
خواندن ۱ دقیقه·۱ سال پیش

در C# چطور کنترلر WebAPI پس از برگرداندن جواب به کلاینت، به پردازش ادامه دهد

آیا در C# تا به حال به یک راه حل "fire and forget" نیاز داشته اید که در آن مشتری یک کنترلر WebAPI را فراخوانی کند که کاری طولانی مدت انجام می دهد، اما واقعاً نتیجه فراخوانی اهمیتی برای مشتری ندارد؟

به عنوان مثال، فرض کنید یک job زمانبندی شده دارید که یک سری وظایف را اجرا می کند و یکی از آنها فراخوانی یک WebAPI برای ایجاد چیزی شبیه انتقال داده از جدول SQL Server به یک فایل است.

مشکل

جدول بزرگ است و انتقال آن، job زمانبندی شده را از اجرای بقیه وظایف در فرآیند باز می‌دارد، یا فرآیند زمان‌بندی را متوقف می‌کند یا با خطای Timeout مواجه می شود. در حالی که نتیجه وب سرویس هیچ اهمیتی در نتیجه نهایی فرآیند ندارد، زیرا WebAPI، خطاها را به روش دیگری مانند ایمیل گزارش می دهد.

راه حل

باید WebAPI یک کد HttpStatus مانند 200 OK در جواب ارسال کند و بگوید که درخواست مشتری به دست من رسید و فرآیند درخواست کامل شده است، در حالی که همچنان به کار روی درخواست در پس‌زمینه ادامه می‌دهد.

برای افزودن قابلیت fire and forget، در کنترلر WebAPI خود، این کار را انجام دهید:

public async Task<IActionResult> Post(string id) { try { return Ok('Request submitted successfully'); } finally { Response.OnCompleted(async () => { await DoProcessing(id); }); } }

بخش کلیدی کد قسمت Response.OnCompleted است که به برنامه شما اجازه می دهد حتی پس از گزارش OK به مشتری، به اجرای خود ادامه دهد.

sql server
۱
۰
فرهاد صادقی
فرهاد صادقی
مهندس نرم افزار، طراحی و راه اندازی سیستم های نرم افزاری بر پایه معماری میکروسرویس
شاید از این پست‌ها خوشتان بیاید