Mahi in Tech
407 subscribers
202 photos
17 videos
8 files
255 links
Download Telegram
دست از سر using (new HttpClient) بردارید 😁
توی دنیای دات‌نت، همیشه به ما یاد دادن که هر کلاسی که IDisposable رو پیاده‌سازی کرده، باید توی بلاک using استفاده بشه تا منابع‌ش بعد از انجام کار بلافاصله آزاد شه.
اما درمورد HttpClient یه استثنای بزرگ هست که خیلی از افراد هنوز درگیرش می‌شن.

سناریوی مشکل‌ساز:
شما کدی می‌نویسید که قراره یه API خارجی رو کال کنه. طبق عادت، اینطوری می‌نویسید:

using (var client = new HttpClient())
{
    var response = await client.GetAsync("https://api.example.com");
}


روی سیستم خودتون همه چیز عالی هست. پروژه می‌ره روی پروداکشن و زیر بار ترافیک قرار می‌گیره؛ اما ناگهان لاگ‌ها پر می‌شه از خطای SocketException و سرور عملاً از دسترس خارج می‌شه.

حالا چرا این اتفاق می‌افته؟
وقتی شما اینستنس کلاینت رو Dispose می‌کنید، آبجکت توی کد از بین میره، اما سیستم عامل پورت شبکه (Socket) متصل به اون رو تا چند دقیقه (به‌خاطر وضعیت TIME_WAIT در پروتکل TCP) باز نگه می‌داره.
اگر ترافیک بالا باشه، تمام پورت‌های سرور اشغال می‌شن و سیستم عامل دیگه پورتی نداره که به درخواست‌های جدید اختصاص بده (Socket Exhaustion).

یکی از راه حل‌ها: استفاده از IHttpClientFactory
مایکروسافت از نسخه‌ی ۲.۱ دات‌نت core به بعد، یک راهکار استاندارد و تمیز براش ارائه کرد. به جای ساختن نمونه‌های جدید، باید مدیریت طول عمر HttpClient رو به فکتوری خودش بسپرید.

⚙️ پیاده‌سازی:
۱. اول توی فایل Program.cs سرویس‌اش رو رجیستر کنید:
builder.Services.AddHttpClient();
۲. حالا توی سرویس یا کنترلر خودتون، IHttpClientFactory رو اینجکت کنید:
public class MyService
{
    private readonly IHttpClientFactory _clientFactory;

    public MyService(IHttpClientFactory clientFactory)
    {
        _clientFactory = clientFactory;
    }

    public async Task GetData()
    {
        var client = _clientFactory.CreateClient();
        var response = await client.GetAsync("...");
    }
}


مزایای این روش:
- جلوگیری از کرش سرور: کانکشن‌‌ها به صورت هوشمند بازیافت و مدیریت می‌شن.

- پرفورمنس بالاتر: سربار ساختن مداوم کلاینت حذف می‌شه.

- مدیریت DNS: مشکل معروفِ "کش شدن DNS در HttpClientهای استاتیک" رو هم هندل می‌کنه.

ℹ️ البته که وقتی از IHttpClientFactory استفاده می‌کنید، فقط به ساختن کلاینت‌های عمومی محدود نیستید و می‌تونید کلاینت‌هایی بسازید که تنظیمات خاص خودشون رو داشته باشند یا حتی لاجیک درخواست رو در خودشون نگه دارن، که خب در این پست نمی‌گنجه. می‌تونید اینجا و اینجا درموردشون مطالعه کنید.

Use IHttpClientFactory to implement resilient HTTP requests
Please open Telegram to view this post
VIEW IN TELEGRAM
71
خطر حمله‌ی قلبی برای بچه‌های دات‌نت دولوپر.
😁442
Forwarded from NetBlocks
⚠️ Confirmed: Live metrics show #Iran is now in the midst of a nationwide internet blackout; the incident follows a series of escalating digital censorship measures targeting protests across the country and hinders the public's right to communicate at a critical moment 📉
💔1
This media is not supported in your browser
VIEW IN TELEGRAM
👍1
درود و امید که خوب باشید.

یک‌سری منابع قرار می‌دم که شاید توی این وضعیت‌‌ای که امیدوارم هرچه زودتر به خوبی تموم شه، به‌دردتون بخوره.

دی‌ان‌اس داخلی:
5.202.100.100
5.202.100.101

رجیستری داکر:
hub.hamdocker.ir
docker.mobinhost.com
docker.arvancloud.ir

میرور NPM, PyPi و NuGet:
runflare.com/mirrors

میرور Ubuntu:
mirror.digitalvps.ir/ubuntu
ubuntu.pishgaman.net/ubuntu
ubuntu.pars.host
mirror.arvancloud.ir/ubuntu

داکیومنت یه‌سری از تکنولوژی‌ها و ویکی‌پدیای کامپیوتر:
193.151.130.199

DNSTT Resolver:
8.8.8.8:53
77.88.8.8:53
77.88.8.1:53
2.188.21.130:53
2.189.1.1:53
👍7
Mahi in Tech
درود و امید که خوب باشید. یک‌سری منابع قرار می‌دم که شاید توی این وضعیت‌‌ای که امیدوارم هرچه زودتر به خوبی تموم شه، به‌دردتون بخوره. دی‌ان‌اس داخلی: 5.202.100.100 5.202.100.101 رجیستری داکر: hub.hamdocker.ir docker.mobinhost.com docker.arvancloud.ir …
اگر هم قصد داشتید که یک پیام‌رسان سلف‌هاست بالا بیارید (چیزی که توی این خاموشی ارتباطات به کار میاد) و حوصله‌ی سر و کله زدن با این‌ها و قطعی اینترنت رو برای بالا آوردن mattermost یا rocketchat و یا هرچی نداشتین، می‌تونید از سرویس hamravesh.com استفاده کنید و روش RocketChat خودتون رو بدون دردسر راه‌اندازی کنین، E2EE هم می‌شه روش فعال کرد تا خیال‌تون کمی راحت‌تر باشه.

درغیر این‌صورت ایمیج‌هاشون توی همین رجیستری‌ها موجود هستن، می‌تونید خودتون بالا بیارید.
👍4
عزیزان ایران، اگر وصل شدین یادتون نره این تنظیم رو..
💯3
Mahi in Tech
runflare.com/mirrors
برای دوستان دات‌نت دولوپر،‌
به‌نظر میاد این سرویس رجیستری NuGet هم اضافه کرده، می‌تونید استفاده کنید:
https://mirror-nuget.runflare.com/
👍4
حواستون باشه توی این وضعیت بدون داشتن سشن فعال از اکانت تلگرام‌تون خارج نشید. به‌هیچ وجه کد OTP تلگرام ارسال یا دریافت نمی‌شه بر بستر پیامک.
😭3
این‌ها خیال می‌کنند با کندنِ شکوفه، بهار نمی‌آید.
🕊5
اپ SlipNet یک کلاینت متن‌باز و رایگان برای اندروید هست، که با بهره‌گیری از تونل‌سازی DNS-over-QUIC و موتور Slipstream، امکان انتقال امن و کم‌تاخیر درخواست‌های DNS رو فراهم می‌کنه.
یکی از قابلیت‌های مهم این برنامه اسکن و شناسایی خودکار سرورهای DNS سازگار هست، تا کاربر بدون تنظیمات پیچیده، بهترین گزینه‌های موجود رو پیدا و تست کنه. همچنین امکان ساخت و مدیریت چندین پروفایل مختلف برای سرورها وجود داره، که جابجایی بین تنظیمات مختلف رو ساده و سریع می‌کنه.

👉 github.com/anonvector/SlipNet/releases/latest

🔍 ircf.space
@ircfspace
▪️ حقیقتا توانی برای فعالیت‌های غیرضروری نبوده و نیست، اما خب چه می‌شه کرد؟ مجبوریم با همون شیب ملایمی که همیشه تلاش می‌کردیم پیش بریم. با همه‌ی اتفاقات وحشتناکی که افتاده حس کردم که سکوت کردن، تنها راه برای پردازش این همه درد و اندوه بوده.
👍3❤‍🔥1
👀 Pipeline Pattern در CSharp، وقتی متد Handleت پر از if-else و مسئولیت‌های مختلف می‌شه.

سناریوی واقعی:
داری یک عملیات ثبت سفارش می‌نویسی. باید اعتبارسنجی کنی، موجودی چک کنی، تخفیف حساب کنی، توی دیتابیس ذخیره کنی، نوتیفیکیشن بفرستی و لاگ بگیری.
اگر همه این کارها رو توی یه متد طولانی بنویسی، بعد از چند ماه دیگه هیچ‌کس جرأت تغییرش رو نداره. تستش هم که دیگه کابوسه.

☑️ راه‌حل ساده: Pipeline Pattern
هر مرحله رو یه کلاس مستقل می‌کنیم. یک Context داریم که هم Request و هم Result رو داخلش نگه می‌داره و با پراپرتی HasError جریان رو کنترل می‌کنه. Stateهای مشترک رو هم می‌تونیم توی همین Context نگه داریم.

⚙️ پیاده‌سازی و استفاده‌ش رو هم توی تصاویر بالا گذاشتم.
هر مرحله اطلاعات مورد نیازش رو از Context می‌خونه، Result رو پر یا به‌روزرسانی می‌کنه و در صورت نیاز HasError رو true می‌کنه. اگر جایی HasError صحیح بشه، باقی مراحل اجرا نمی‌شن.

مزایای این روش:
- هر کلاس فقط یک کار مشخص انجام می‌ده
- اضافه کردن مرحله‌ی جدید فقط یه کلاس جدید + یه AddStep
- تست هر مرحله ‌به‌صورت جداگانه راحت‌تره
- کد بیزینس اصلی تمیز می‌مونه

البته که این فقط یک پیاده‌سازی ساده بود و به‌روش‌های مختلفی می‌شه این پترن رو اجرایی کرد.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍11