✅ افزایش امنیت JWT توسط Refresh Token در ASP NET Core
وقتی از Jwt واسه احراز هویت برنامه تون استفاده میکنین سوالی که پیش میاد اینه که زمانی که توکن کاربر Expire (منقضی) شد چی میشه؟!
1️⃣ آیا باید کاربر رو Logout کنیم و ازش بخوایم دوباره لاگین کنه؟ اگه وسط یه عملیات مهم باشه چی؟! همه چی از دست میره که! 🤔
2️⃣ شایدم باید مدت زمان توکن رو زیاد کنیم، مثلا 1 سال !! تا دیر به دیر منقضی بشه. که این عملا بدترین راه حل ممکن هست چرا که اگه توکن به سرقت بره، هکر تا یک سال میتونه هر کاری میخواد با توکن طرف (هویتش) بکنه 😕
3️⃣ یا اینکه یوزر و پسورد طرف رو بگیریم سمت خودمون ذخیره کنیم (مثلا توی localStorage توی وب) و هر موقع توکن اش منقضی شد، زیر پوستی خودمون یوزر پس طرف رو بفرستیم و توکن جدید بگیریم؟! اینم که ضعف امنیتی داره چون یوزر و پس طرف در معرض خطره 🤨
🔰پس راه حل چیه؟
🔸راه حل استفاده از Refresh Token هست. به این صورت که وقتی طرف برای بار اول میخواد احراز هویت بشه، یوزر و پس اش رو به ما میده و ما 2تا توکن بهش میدیم. یکی access_token که همون Jwt هست و دیگری یک refresh_token که عملا یه متن رندم (مثلا یه Guid) هست
این رفرش توکن (guid) توی دیتابیس ما ذخیره شده که به ازای چه کاربری و چه access_token ایی هست، در نتیجه وقتی طرف access_token اش منقضی میشه به جای اینکه لازم باشه 2مرتبه یوزر و پس برای ما بفرسته، با فرستادن refresh_token میتونه یه توکن جدید (شامل یه access_token جدید + یه refresh_token جدید) دریافت کنه که اینطوره ضریب امنیت بالا میره (چون یوزر پس اشو نمیفرسته)
🔹ضمن اینکه هر بار گرفتن access_token توسط refresh_token ، اون access_token قبلی رو غیرفعال میکنه، پس اگر access_token به سرقت بره، با Revoke کردنش توسط refresh_token، غیر قابل استفاده میشه و باز هم ضریب امنیت بالاتر میره
🔸این عملیات هم سمت فرانت یا کلاینت باید پشت پرده و زیر پوستی انجام بشه تا کاربر اصلا متوجه logout و login شدن مجددش نشه. مثلا توی Angular توسط HttpIncerceptor میتونیم قبل از Api Call ها چک کنیم که اگر access_token مون منقضی شده، ابتدا توسط refresh_token، یه توکن جدید بگیریم و بعد Api Call مون رو انجام بدیم
🔰خیلی از دوستان هم میپرسن مدت زمان انقضای access_token و refresh_token چقدر باید باشه؟
🔹هیچ بایدی وجود نداره و همه جوره زمان میدن بهش. درکل چیزی که مهمه اینه که مدت زمان access_token باید کم باشه و مدت زمان refresh_token بیشتر.
مثلا شخصا ترجیح میدم مدت زمان access_token بین 5 دقیقه تا نهایتا 1 ساعت باشه
و مدت زمان refresh_token بین 1 هفته تا نهایتا 1 ماه باشه
🔸هرچی کمتر باشه ضریب امنیت بیشتر میشه ولی تعداد ریکوئستا به سرور هم بیشتر میشه
البته یه مشکلی که هنگام استفاده از RefreshToken پیش میاد اینه که اگه کاربر توی مدت زمان refresh_token با سایت هیچ تعاملی نداشته باشه که توکن جدید دریافت کنه، مثلا بیشتر از 1 ماه به سایت ما سر نزنه، بعدش کلا logout میشه و باید دوباره توسط User و Pass لاگین کنه (که خب به نظرم منطقی هم هست)
❇️ از بین مقاله های زیادی که برای RefreshToken در ASP Core هست؛ این2تا رو براتون گلچین کردم که خیلی خوب توضیح دادند و اصولی پیاده سازی کردند
1️⃣ https://bit.ly/2ZZ2JwT
2️⃣ https://bit.ly/2ZWTk9o
وقتی از Jwt واسه احراز هویت برنامه تون استفاده میکنین سوالی که پیش میاد اینه که زمانی که توکن کاربر Expire (منقضی) شد چی میشه؟!
1️⃣ آیا باید کاربر رو Logout کنیم و ازش بخوایم دوباره لاگین کنه؟ اگه وسط یه عملیات مهم باشه چی؟! همه چی از دست میره که! 🤔
2️⃣ شایدم باید مدت زمان توکن رو زیاد کنیم، مثلا 1 سال !! تا دیر به دیر منقضی بشه. که این عملا بدترین راه حل ممکن هست چرا که اگه توکن به سرقت بره، هکر تا یک سال میتونه هر کاری میخواد با توکن طرف (هویتش) بکنه 😕
3️⃣ یا اینکه یوزر و پسورد طرف رو بگیریم سمت خودمون ذخیره کنیم (مثلا توی localStorage توی وب) و هر موقع توکن اش منقضی شد، زیر پوستی خودمون یوزر پس طرف رو بفرستیم و توکن جدید بگیریم؟! اینم که ضعف امنیتی داره چون یوزر و پس طرف در معرض خطره 🤨
🔰پس راه حل چیه؟
🔸راه حل استفاده از Refresh Token هست. به این صورت که وقتی طرف برای بار اول میخواد احراز هویت بشه، یوزر و پس اش رو به ما میده و ما 2تا توکن بهش میدیم. یکی access_token که همون Jwt هست و دیگری یک refresh_token که عملا یه متن رندم (مثلا یه Guid) هست
این رفرش توکن (guid) توی دیتابیس ما ذخیره شده که به ازای چه کاربری و چه access_token ایی هست، در نتیجه وقتی طرف access_token اش منقضی میشه به جای اینکه لازم باشه 2مرتبه یوزر و پس برای ما بفرسته، با فرستادن refresh_token میتونه یه توکن جدید (شامل یه access_token جدید + یه refresh_token جدید) دریافت کنه که اینطوره ضریب امنیت بالا میره (چون یوزر پس اشو نمیفرسته)
🔹ضمن اینکه هر بار گرفتن access_token توسط refresh_token ، اون access_token قبلی رو غیرفعال میکنه، پس اگر access_token به سرقت بره، با Revoke کردنش توسط refresh_token، غیر قابل استفاده میشه و باز هم ضریب امنیت بالاتر میره
🔸این عملیات هم سمت فرانت یا کلاینت باید پشت پرده و زیر پوستی انجام بشه تا کاربر اصلا متوجه logout و login شدن مجددش نشه. مثلا توی Angular توسط HttpIncerceptor میتونیم قبل از Api Call ها چک کنیم که اگر access_token مون منقضی شده، ابتدا توسط refresh_token، یه توکن جدید بگیریم و بعد Api Call مون رو انجام بدیم
🔰خیلی از دوستان هم میپرسن مدت زمان انقضای access_token و refresh_token چقدر باید باشه؟
🔹هیچ بایدی وجود نداره و همه جوره زمان میدن بهش. درکل چیزی که مهمه اینه که مدت زمان access_token باید کم باشه و مدت زمان refresh_token بیشتر.
مثلا شخصا ترجیح میدم مدت زمان access_token بین 5 دقیقه تا نهایتا 1 ساعت باشه
و مدت زمان refresh_token بین 1 هفته تا نهایتا 1 ماه باشه
🔸هرچی کمتر باشه ضریب امنیت بیشتر میشه ولی تعداد ریکوئستا به سرور هم بیشتر میشه
البته یه مشکلی که هنگام استفاده از RefreshToken پیش میاد اینه که اگه کاربر توی مدت زمان refresh_token با سایت هیچ تعاملی نداشته باشه که توکن جدید دریافت کنه، مثلا بیشتر از 1 ماه به سایت ما سر نزنه، بعدش کلا logout میشه و باید دوباره توسط User و Pass لاگین کنه (که خب به نظرم منطقی هم هست)
❇️ از بین مقاله های زیادی که برای RefreshToken در ASP Core هست؛ این2تا رو براتون گلچین کردم که خیلی خوب توضیح دادند و اصولی پیاده سازی کردند
1️⃣ https://bit.ly/2ZZ2JwT
2️⃣ https://bit.ly/2ZWTk9o
C-Sharpcorner
Handle Refresh Token Using ASP.NET Core 2.0 And JSON Web Token
In this article , you will learn how to deal with the refresh token when you use jwt (JSON Web Token) as your access_token.
❇️ #ویدئو آموزش معماری Microservice در ASP.NET Core (زبان اصلی زیر نویس دار)
از پایین ویدئو گزینه [Subtitle/captions] میتوانید زیرنویس آن را فعال کنید
[01:06] - Introducing the .NET application architecture website
[05:23] - Running the reference application
[06:33] - Understanding the target audience
[07:35] - Testing strategy
[09:11] - Exploring the technology stack
[13:25] - Managing the weight of the API gateway
[16:35] - Adopting the guidance
[21:33] - Communication patterns between microservices
[22:36] - Modeling challenges with microservices
[26:14] - Getting help with the reference application
Useful Links
GitHub repository for eShopOnContainers
.NET Microservices - Architecture e-book
.NET Application Architecture Guidance
از پایین ویدئو گزینه [Subtitle/captions] میتوانید زیرنویس آن را فعال کنید
[01:06] - Introducing the .NET application architecture website
[05:23] - Running the reference application
[06:33] - Understanding the target audience
[07:35] - Testing strategy
[09:11] - Exploring the technology stack
[13:25] - Managing the weight of the API gateway
[16:35] - Adopting the guidance
[21:33] - Communication patterns between microservices
[22:36] - Modeling challenges with microservices
[26:14] - Getting help with the reference application
Useful Links
GitHub repository for eShopOnContainers
.NET Microservices - Architecture e-book
.NET Application Architecture Guidance
Docs
Microservice Architecture with ASP.NET Core
Having a solid architecture is an essential piece for ensuring the longevity of your software.In this episode Cesar De la Torre Llorente (@cesardelatorre) comes on the show to talk about ASP.NET Core application architecture for microservices and containers.[01:06]…
✅ قابلیت Decompile کد های #C در Visual Studio
قبلا در مورد اضافه شدن قابلیت Decompile کد های سی شارپ در VSCode (https://t.iss.one/DotNetZoom/944) توسط ILSpy گفته بودیم
این قابلیت برای Visual Studio هم وجود داره اما در حالت پیش نمایش هست و به صورت پیشفرض فعال نیست
جهت فعال سازی این قابلیت باید از منو Tools گزینه Options را انتخاب کرده و از قسمت Text Editor > C# > Advanced گزینه Enable navigation to decompiled sources رو تیک بزنین
بعد از فعال سازی روی کلاس/متدی که سورسش رو ندارین راست کلید و گزینه "Go to Definition" رو انتخاب کنین براتون Decompile کنه و کدشو نشونتون بده
این امکان هم توسط کتابخانه معروف ILSpy انجام شده و بار اولی که ازش استفاده کنین یه سوال (در مورد قبول License کتابخونه ILSpy) میپرسه که گزینه Yes رو باید بزنین
جهت استفاده از این قابلیت باید حداقل ویژوال استادیو 2019 نسخه 16.5 به بالا نصب داشته باشین (از منوی Help گزینه Check for Update میتونین چک کنین)
قبلا در مورد اضافه شدن قابلیت Decompile کد های سی شارپ در VSCode (https://t.iss.one/DotNetZoom/944) توسط ILSpy گفته بودیم
این قابلیت برای Visual Studio هم وجود داره اما در حالت پیش نمایش هست و به صورت پیشفرض فعال نیست
جهت فعال سازی این قابلیت باید از منو Tools گزینه Options را انتخاب کرده و از قسمت Text Editor > C# > Advanced گزینه Enable navigation to decompiled sources رو تیک بزنین
بعد از فعال سازی روی کلاس/متدی که سورسش رو ندارین راست کلید و گزینه "Go to Definition" رو انتخاب کنین براتون Decompile کنه و کدشو نشونتون بده
این امکان هم توسط کتابخانه معروف ILSpy انجام شده و بار اولی که ازش استفاده کنین یه سوال (در مورد قبول License کتابخونه ILSpy) میپرسه که گزینه Yes رو باید بزنین
جهت استفاده از این قابلیت باید حداقل ویژوال استادیو 2019 نسخه 16.5 به بالا نصب داشته باشین (از منوی Help گزینه Check for Update میتونین چک کنین)
✅ پروژه سورس باز فروش بیمه به صورت Microservices در NET Core.
🔰 تکنولوژی های استفاده شده
.NET Core 2.1
Entity Framework Core
#MediatR
#Marten
#Eureka
#Ocelot
#JWT Tokens
#RestEase
#RawRabbit
#NHibernate
#Polly
#NEST (#ElasticSearch client)
#Dapper
#SignalR
#MicroServices
DynamicExpresso
https://github.com/asc-lab/dotnetcore-microservices-poc
🔰 تکنولوژی های استفاده شده
.NET Core 2.1
Entity Framework Core
#MediatR
#Marten
#Eureka
#Ocelot
#JWT Tokens
#RestEase
#RawRabbit
#NHibernate
#Polly
#NEST (#ElasticSearch client)
#Dapper
#SignalR
#MicroServices
DynamicExpresso
https://github.com/asc-lab/dotnetcore-microservices-poc
رقابت بسیار نزدیک پرفورمنس gRPC در دات نت 5 در کنار RUST و ++C و Go
آدرس بنچمارک:
https://codehaks.com/go/ykn
آدرس بنچمارک:
https://codehaks.com/go/ykn
✅ برترین Shortcut های Visual Studio 2019
اگه میخواین از ویژوال استادیو به صورت حرفه ای استفاده کنین و البته بازدهی تون رو خیلی بیشتر کنین، باید میانبر های ویژوال استادیو رو بلد باشین. اینطوری کد نویسی خیلی شیرین تر میشه.
🔰در اینجا سعی کردم بهترین و کاربردی ترین میانبر ها رو لیست کنم:
🔸Code Formatting : Ctrl+K+D
کد شما رو تر و تمیز یا به به قولی صاف و صوف میکنه
🔹Suggested Code Refactoring : Ctrl+. or Alt+Enter
پیشنهاد هایی برای ریفکتور کردن کدی که cursor موس روش هست بهتون میده (در واقع light bulb ویژوال استادیو رو باز میکنه)
🔸Go to Definition : F12
شما رو به جایی که کلاس/اینترفیس/متد مربوطه تعریف شده ارجاع میده
🔹Go to Implementations : Shift+F12
شما رو به جایی که کلاس/اینترفیس/متد پیاده سازی شده ارجاع میده (روی اینترفیس تست اش کنین) + نمایش لیست رفرنس ها
🔸Go to Line : Ctrl+G
شماره خط کد رو از شما میگیره و شما رو به کد مربوطه ارجاع میده
🔹Find : Ctrl+F
پنجره جستجو رو براتون باز میکنه
🔸Find in files (Advance) : Ctrl+Shift+F
پنجره جستجوی پیشرفته رو براتون باز میکنه
🔹Go to All search : Ctrl+T or Ctrl+,
بنجره جستجو در همه جا (کد ها، نام فایل ها، و...) رو براتون باز میکنه.
🔸Quick Search : Ctrl+Alt+Q
یه چیزی مشابه قبلی با این تفاوت که توی ابزار و امکانات ویژوال استادیو هم سرچ میکنه (میشه انتخاب کرد فقط تو کد ها و فایل ها سرچ کنه)
🔹Show Current File in Solution Explorer : Ctrl+[+S
فایل جاری رو توی Solution Explorer به صورت انتخاب شده نشونش میده
🔸Go to Matching Brace : Ctrl+]
شما رو به براکت شروع و پایان کد مربوطه (متد/شرط/حله و...) ارجاع میده
🔹Comment Selected Code : Ctrl+K+C
کد انتخاب شده یا خطی که cursor موس روش هست رو کامنت میکنه
🔸Uncomment Selected Code : Ctrl+K+U
کد انتخاب شده یا خطی که cursor موس روش هست رو از کامنت خارج میکنه
🔹Show Autocomlete : Ctrl+Space
بسته به اینکه cursor موس تون روی چه کدی هست منوی Autocomplete مربوطه رو باز میکنه
🔸Show Overloads : Ctrl+Shift+Space
وقتی cursor موس روی یک متد هست، لیست overload های دیگه شو نشون میده
🔹Collaps methods : Ctrl+M+O
متد های فایل جاری رو collapse میکنه (میبنده) مناسب واسه وقتی که کلاس شلوغی دارین
🔸Expand methods : Ctrl+M+P
متد های فایل جاری رو از collapse در بر میگردونه به حالت عادی (باز میکنه)
🔹Ctrl+Enter
یک خط جدید (new line) بالای جایی که cursor موس قرار داره ایجاد میکنه
🔸Ctrl+Shift+Enter
یک خط جدید (new line) پایین جایی که cursor موس قرار داره ایجاد میکنه
🔹Rename Property : Ctrl+R+R
نام یک پروپرتی، متد، کلاس و... رو در همه جای پروژه تغییر میده
🔸View Clipboard history : Ctrl+Shift+V
لیست تاریخچه کلیپ بورد شما رو نشون میده و میتونین ازش انتخاب کنین
___________________
اگه میخواین از ویژوال استادیو به صورت حرفه ای استفاده کنین و البته بازدهی تون رو خیلی بیشتر کنین، باید میانبر های ویژوال استادیو رو بلد باشین. اینطوری کد نویسی خیلی شیرین تر میشه.
🔰در اینجا سعی کردم بهترین و کاربردی ترین میانبر ها رو لیست کنم:
🔸Code Formatting : Ctrl+K+D
کد شما رو تر و تمیز یا به به قولی صاف و صوف میکنه
🔹Suggested Code Refactoring : Ctrl+. or Alt+Enter
پیشنهاد هایی برای ریفکتور کردن کدی که cursor موس روش هست بهتون میده (در واقع light bulb ویژوال استادیو رو باز میکنه)
🔸Go to Definition : F12
شما رو به جایی که کلاس/اینترفیس/متد مربوطه تعریف شده ارجاع میده
🔹Go to Implementations : Shift+F12
شما رو به جایی که کلاس/اینترفیس/متد پیاده سازی شده ارجاع میده (روی اینترفیس تست اش کنین) + نمایش لیست رفرنس ها
🔸Go to Line : Ctrl+G
شماره خط کد رو از شما میگیره و شما رو به کد مربوطه ارجاع میده
🔹Find : Ctrl+F
پنجره جستجو رو براتون باز میکنه
🔸Find in files (Advance) : Ctrl+Shift+F
پنجره جستجوی پیشرفته رو براتون باز میکنه
🔹Go to All search : Ctrl+T or Ctrl+,
بنجره جستجو در همه جا (کد ها، نام فایل ها، و...) رو براتون باز میکنه.
🔸Quick Search : Ctrl+Alt+Q
یه چیزی مشابه قبلی با این تفاوت که توی ابزار و امکانات ویژوال استادیو هم سرچ میکنه (میشه انتخاب کرد فقط تو کد ها و فایل ها سرچ کنه)
🔹Show Current File in Solution Explorer : Ctrl+[+S
فایل جاری رو توی Solution Explorer به صورت انتخاب شده نشونش میده
🔸Go to Matching Brace : Ctrl+]
شما رو به براکت شروع و پایان کد مربوطه (متد/شرط/حله و...) ارجاع میده
🔹Comment Selected Code : Ctrl+K+C
کد انتخاب شده یا خطی که cursor موس روش هست رو کامنت میکنه
🔸Uncomment Selected Code : Ctrl+K+U
کد انتخاب شده یا خطی که cursor موس روش هست رو از کامنت خارج میکنه
🔹Show Autocomlete : Ctrl+Space
بسته به اینکه cursor موس تون روی چه کدی هست منوی Autocomplete مربوطه رو باز میکنه
🔸Show Overloads : Ctrl+Shift+Space
وقتی cursor موس روی یک متد هست، لیست overload های دیگه شو نشون میده
🔹Collaps methods : Ctrl+M+O
متد های فایل جاری رو collapse میکنه (میبنده) مناسب واسه وقتی که کلاس شلوغی دارین
🔸Expand methods : Ctrl+M+P
متد های فایل جاری رو از collapse در بر میگردونه به حالت عادی (باز میکنه)
🔹Ctrl+Enter
یک خط جدید (new line) بالای جایی که cursor موس قرار داره ایجاد میکنه
🔸Ctrl+Shift+Enter
یک خط جدید (new line) پایین جایی که cursor موس قرار داره ایجاد میکنه
🔹Rename Property : Ctrl+R+R
نام یک پروپرتی، متد، کلاس و... رو در همه جای پروژه تغییر میده
🔸View Clipboard history : Ctrl+Shift+V
لیست تاریخچه کلیپ بورد شما رو نشون میده و میتونین ازش انتخاب کنین
___________________
Telegram
Attach Files
✳️میانافزاری برای ثبت آمار بازدیدکنندگان برنامههای ASP.NET Core
مقاله زیر نمونه پیادی سازی یک middleware برای asp core رو نشون میده که کارش ثبت آمار بازدید کنندگان سایت هست. اینکه چه کسانی با چه ip هایی و از چه کشور هایی در چه زمان هایی کدام صفحات رو بازدید کردند.
کانفیگ و استفاده ازش بسیار راحته و آموزشش در لینک زیر هست
https://matteofabbri.org/read/server-side-analytics
🔸نکات جالبی که این کتابخونه داره اینه که:
۱- برای ذخیره سازی اطلاعات میتونین از store های موجود از جمله MongoDb, SqlServer, SqLite استفاده کنین
۲- یا اینکه store سفارشی خودتون رو بنویسین و مثلا اطلاعات رو توی یه دیتابیس دیگه مثل MySql ذخیره کنین
۳- میتونین مسیر ها یا پسوند هایی رو مشخص کنین که اطلاعات اونا رو اصلا ثبت نکنه. مثلا مسیر /js یا پسوند های .js, .css, .jpg
۴- میتونین تنظیم کنین تا فقط درخواست های یک مسیر مشخص رو ثبت کنه و نه تمام درخواست های سایت
۵- نام جداول لازم برای ذخیره آمار بازدید کنندگان رو تغییر بدین
۶- توسط یک دیتابیس لوکال، نام کشور ها رو از روی ip تشخیص میده
۷- اگه بر اساس range ip نتونست نام کشور رو پیدا کنه، از api های دیگری جهت تشخص نام کشور استفاده میکنه که دیتای معتبر تری میدن.
مخزن گیتهاب :
https://github.com/matteofabbri/ServerSideAnalytics
دمو گزارش آمار بازدیدکنندگان :
https://matteofabbri.org/stat
پیشنهاد میکنم سورس کدش رو بررسی کنین، ایده های جالبی بهتون میده
_______________
مقاله زیر نمونه پیادی سازی یک middleware برای asp core رو نشون میده که کارش ثبت آمار بازدید کنندگان سایت هست. اینکه چه کسانی با چه ip هایی و از چه کشور هایی در چه زمان هایی کدام صفحات رو بازدید کردند.
کانفیگ و استفاده ازش بسیار راحته و آموزشش در لینک زیر هست
https://matteofabbri.org/read/server-side-analytics
🔸نکات جالبی که این کتابخونه داره اینه که:
۱- برای ذخیره سازی اطلاعات میتونین از store های موجود از جمله MongoDb, SqlServer, SqLite استفاده کنین
۲- یا اینکه store سفارشی خودتون رو بنویسین و مثلا اطلاعات رو توی یه دیتابیس دیگه مثل MySql ذخیره کنین
۳- میتونین مسیر ها یا پسوند هایی رو مشخص کنین که اطلاعات اونا رو اصلا ثبت نکنه. مثلا مسیر /js یا پسوند های .js, .css, .jpg
۴- میتونین تنظیم کنین تا فقط درخواست های یک مسیر مشخص رو ثبت کنه و نه تمام درخواست های سایت
۵- نام جداول لازم برای ذخیره آمار بازدید کنندگان رو تغییر بدین
۶- توسط یک دیتابیس لوکال، نام کشور ها رو از روی ip تشخیص میده
۷- اگه بر اساس range ip نتونست نام کشور رو پیدا کنه، از api های دیگری جهت تشخص نام کشور استفاده میکنه که دیتای معتبر تری میدن.
مخزن گیتهاب :
https://github.com/matteofabbri/ServerSideAnalytics
دمو گزارش آمار بازدیدکنندگان :
https://matteofabbri.org/stat
پیشنهاد میکنم سورس کدش رو بررسی کنین، ایده های جالبی بهتون میده
_______________
نسخه بتا فیلترشکن معروف 1.1.1.1 مخصوص ویندوز و مک منتشر شد!!
لینک دانلود :
نسخه مخصوص ویندوز
نسخه مخصوص مک
—-
لینک دانلود :
نسخه مخصوص ویندوز
نسخه مخصوص مک
—-
❇️استفاده از پروکسی داخل پروژه های دات نت Framework Full
https://goo.gl/4JbeYW
خب وقتی پروکسی سرور خودتون رو راه انداختین باید کاری کنین که تمام درخواست های وبسایت شما (مثلا درخواست ارسال نوتیفیکشن تلگرام) از طریق پروکسی سرور شما ارسال بشه نه توسط خود وبسایتتون (یعنی Default Proxy پروژه تون رو عوض کنین)
تو NetFramework Full به صورت زیر عمل میکردیم
- توسط خاصیت BypassList و BypassArrayList میشه لیستی از ادرس هایی رو مشخص کرد که برای درخواست اونها اون ها پروکسی استفاده نشه.
- خاصیت UseDefaultCredentials مشخص میکنه که از Credentials پیشفرض استفاده کنه که در حالت عادی یعنی Username و Password جهت احراز هویت پروکسی سرور ارسال نمیشه.
- اگه پروکسی سروو شما دارای Username و Password باشه باید اون رو داخل خاصیت Credentials شی WebProxy ست کنین.
همچنین مشابه تنظیمات بالا رو میتونین از طریق WebConfig به صورت زیر انجام بدین
درصورتی که نیاز دارین فقط برای یک درخواست خاص (مثل ارسال نوتیفیکیشن توسط api تلگرام) از پروکسی استفاده کنین و نه تمام درخواست ها
باید به صورت زیر عمل کنین
https://goo.gl/4JbeYW
خب وقتی پروکسی سرور خودتون رو راه انداختین باید کاری کنین که تمام درخواست های وبسایت شما (مثلا درخواست ارسال نوتیفیکشن تلگرام) از طریق پروکسی سرور شما ارسال بشه نه توسط خود وبسایتتون (یعنی Default Proxy پروژه تون رو عوض کنین)
تو NetFramework Full به صورت زیر عمل میکردیم
WebRequest.DefaultWebProxy = new WebProxy("https://127.0.0.1:9050", BypassOnLocal: true) { UseDefaultCredentials = true };
- فیلد BypassOnLocal مشخص میکنه که درخواست های local (محلی) از طریق پروکسی عبور نکنه و مستقیما ارسال بشه.- توسط خاصیت BypassList و BypassArrayList میشه لیستی از ادرس هایی رو مشخص کرد که برای درخواست اونها اون ها پروکسی استفاده نشه.
- خاصیت UseDefaultCredentials مشخص میکنه که از Credentials پیشفرض استفاده کنه که در حالت عادی یعنی Username و Password جهت احراز هویت پروکسی سرور ارسال نمیشه.
- اگه پروکسی سروو شما دارای Username و Password باشه باید اون رو داخل خاصیت Credentials شی WebProxy ست کنین.
WebRequest.DefaultWebProxy = new WebProxy("https://127.0.0.1:9050", BypassOnLocal: true) { Credentials = new NetworkCredential("username", "password") };
ست کردن مقدار WebRequest.DefaultWebProxy باعث میشه پروکسی پیشفرض پروژه تغییر کنه و از این به بعد تمام درخواست ها (به جز Local به دلیل Bypass در این مثال) از طریق پروکسی ارسال و دریافت بشه.همچنین مشابه تنظیمات بالا رو میتونین از طریق WebConfig به صورت زیر انجام بدین
<configuration>
<system.net>
<defaultProxy>
<proxy proxyaddress="https://127.0.0.1:9050" bypassonlocal="true" usesystemdefault="true"/>
</defaultProxy>
</system.net>
</configuration>
اما این روش (DefaultProxy) باعث میشه درخواست های کل سیستم از طریق پروکسی ارسال و دریافت بشهدرصورتی که نیاز دارین فقط برای یک درخواست خاص (مثل ارسال نوتیفیکیشن توسط api تلگرام) از پروکسی استفاده کنین و نه تمام درخواست ها
باید به صورت زیر عمل کنین
WebProxy proxy = new WebProxy("https://127.0.0.1:9050",true);
WebRequest request = WebRequest.Create("https://www.contoso.com");
request.Proxy = proxy;
_______________هفتمین نذری آموزشی فرادرس
۴۰ دوره آموزشی رایگان
برای ثبت نام و دانلود رایگان این آموزش ها از طریق لینک زیر اقدام کنید
https://faradars.org/ev/moharam99/
۴۰ دوره آموزشی رایگان
برای ثبت نام و دانلود رایگان این آموزش ها از طریق لینک زیر اقدام کنید
https://faradars.org/ev/moharam99/
یک پروژه ایرانی که REST API جعلی را برای تست و پروتوتایپنگ، در اختیارتان قرار میدهد. و البته بسیار مفید برای یادگیری و تمرین HttpClient در انگولار!
🔗 https://jsonplaceholder.ir
🔗 https://jsonplaceholder.ir
❇️ کتاب رایگان ماکروسافت برای آموزش #Microservices در NET Core.
💎بدون شک این کتاب یکی از بهترین و کامل ترین منابع جهت یادگیری توسعه برنامههای مبتنی بر معماری Microservices و مدیریت آنها با استفاده از Docker Containers در NET Core. است.
https://docs.microsoft.com/en-us/dotnet/architecture/microservices/
لینک دانلود PDF کتاب
https://aka.ms/microservicesebook
🔸برای یادگیری بهتر میتوانید پروژه eShopOnContainers که بر اساس مفاهیم این آموزش نوشته شده است را بررسی کنید.
https://github.com/dotnet-architecture/eShopOnContainers
💎بدون شک این کتاب یکی از بهترین و کامل ترین منابع جهت یادگیری توسعه برنامههای مبتنی بر معماری Microservices و مدیریت آنها با استفاده از Docker Containers در NET Core. است.
https://docs.microsoft.com/en-us/dotnet/architecture/microservices/
لینک دانلود PDF کتاب
https://aka.ms/microservicesebook
🔸برای یادگیری بهتر میتوانید پروژه eShopOnContainers که بر اساس مفاهیم این آموزش نوشته شده است را بررسی کنید.
https://github.com/dotnet-architecture/eShopOnContainers
مقایسه بهترین کتابخانه های دات نت
https://dotnet.libhunt.com
توسط این سایت میتونین کتابخانه های دات نت رو با هم مقایسه کنین و بفهمین کدوم محبوب تره، همچنین میتونین لیستی از کتابخانه های مشابه رو هم برای هر کدوم پیدا کنید.
این سایت از پارامتر های مختلفی برای مقایسه و امتیازدهی کتابخانه ها استفاده میکنه. از جمله:
- Star, Fork, Watcher گیتهاب
- میزان فعال بودن بر اساس آخریت کامیت
- تعداد دانلود در ماه
- میزان کیفیت کد و ...
- میزان سرچ اش رو هم براسا امار Google Trend نشون میده
مثلا لینک زیر IOC Container های معروف Autofac و Ninject را با هم مقایسه میکنه.
https://dotnet.libhunt.com/compare-autofac-vs-ninject?rel=cmp-lib
🔸 توسط این سایت و سایت قبلی که معرفی کردیم میتونین بدون شک "محبوب ترین" کتابخانه و ابزار ها رو برای کاراتون پیدا کنین.
___
https://dotnet.libhunt.com
توسط این سایت میتونین کتابخانه های دات نت رو با هم مقایسه کنین و بفهمین کدوم محبوب تره، همچنین میتونین لیستی از کتابخانه های مشابه رو هم برای هر کدوم پیدا کنید.
این سایت از پارامتر های مختلفی برای مقایسه و امتیازدهی کتابخانه ها استفاده میکنه. از جمله:
- Star, Fork, Watcher گیتهاب
- میزان فعال بودن بر اساس آخریت کامیت
- تعداد دانلود در ماه
- میزان کیفیت کد و ...
- میزان سرچ اش رو هم براسا امار Google Trend نشون میده
مثلا لینک زیر IOC Container های معروف Autofac و Ninject را با هم مقایسه میکنه.
https://dotnet.libhunt.com/compare-autofac-vs-ninject?rel=cmp-lib
🔸 توسط این سایت و سایت قبلی که معرفی کردیم میتونین بدون شک "محبوب ترین" کتابخانه و ابزار ها رو برای کاراتون پیدا کنین.
___
یکی از مشکلاتی که این روزها بسیار دیده میشود، این است که چگونه باید قیمت بدیم و چطور با مشتری برخورد کنیم!
برنامهنویس حرفهای و واقعی هیچگاه پشت تلفن و با یک جلسه ملاقات هزینه و زمان برای انجام پروژه را مشخص نمیکند. بر خلاف انتظاری که مشتری از شما دارد، به هیچ عنوان نباید هزینههای زمانی و مالی را بدون تجزیه تحلیل اولیه بیان کنید. چرا که اگر مشتری شما واقعاً مصمم در انجام پروژهای باشد که هدفمند است، در این صورت حتماً از شما انتظار یاری و مشاروهٔ را خواهد داشت.
بنابراین توصیه میکنم، شدیداً به این نکته توجه داشته باشید که به هیچ عنوان در ملاقات اولیه و یا حتی در پشت تلفن قیمت و زمان برای پروژهٔ پیشنهادی از طرف مشتری ارائه نکنید. این نشانگر این است که شما به اندازهٔ کافی به زمان، مهارت و تخصص خود مطمئن نیستید.
پیشنهاد میشود هر پروژهای که به شما پیشنهاد شد، آن رو در یک زمان مناسب بررسی و مواردی که فکر میکنید نیاز است مشتری در جریان آن قرار بگیرد را به زبان سادهتر به او انتقال دهید.
1️⃣ ابتدا نیاز مشتری را به خوبی درک کنید، در قدم بعدی بررسی زمانی و سپس بررسی روشها و ابزارهایی که قرار است در توسعهٔ پروژه مورد استفاده برار بگیرد را برای خودتان مشخص کنید.
2️⃣ مهارت خود را همراه با دانش، اطلاعاتِ تکیه بر تجربیات خود برای پیادهسازیِ پروژهٔ پیشنهادی مرور کرده و آن را بر اساس نتیجهٔ حاصل شده ارزیابی کنید.
3️⃣ زمانی را که در طی چند ساعت، روز، هفته و ماه نیاز دارید به طور تقریبی و نزدیک به واقعیت محاسبه کنید. (زمان از نظر مشتری بسیار مهم است، او انتظار دارد در زمانی که شما طی کردهاید به نتیجه برسد).
4️⃣ قیمت را به صراحت و جدی برای مشتریِ خود مشخص کنید (مشخص کردن قیمت ترسی ندارد و شما باید واقعیت را بیان کنید) مهم نیست که مشتری چه واکنشی نشان خواهد داد. شما واقعیت را بیان کنید (بیان کردن واقعیت یعنی یک قدم برای تعریف ارزش برنامهنویسی به طرف مقابل) تا دیگر فرصتی برای بی ارزش کردن کار شما وجود نداشته باشد.
5️⃣ اگر مشتری با شنیدن هزینهٔ پیشنهادی شما جهت انجام کار شروع به مثال آوردن از برنامهنویسانی کرد که متخصص در این حوزه نیستند، مطمئن شوید که او ارزش پروژهٔ خود را به خوبی نمیداند. (اگر مشتری شخصیت انتقاد پذیری داشته باشد، میتوانید او را قانع کنید که کاملاً در اشتباه است) در غیر این صورت نباید در مورد هزینهها اصرار و تأکید داشته باشد، چرا که هزینهها بر اساس نیازها و معیار های واقعی مطرح میشوند.
5️⃣ تخفیف در برنامهنویسی در قدم اول معنی ندارد! در همان لحظه که احساس میکنید مشتریِ شما بیشتر به فکر هزینه است تا به فکر کیفیت، شک نکنید که در نهایت رضایت دو جانبهای وجود نخواهد داشت! چون این قرارداد یک طرفه و صرفاً بر اساس هزینهها بسته میشود.
6️⃣ به مشتری اطمینان خاطر بدهید که پروژهٔ او در بهترین حالت ممکن تولید خواهد شد! اگر بتوانید و اگر مهارت شما در حدی باشد که محصولی مشابه محصولات استاندارد و جهانی بسازید شک نکنید که موفق خواهید شد. تأکید میکنم مشتری در قدم اول هیچ کاری با کدهای شما ندارد و صرفاً منتظر نتیجهای است که باید ببیند و آن را حس و درک کند.
7️⃣ مشاوره را در هر مرحله از توسعهٔ پروژه در نظر بگیرید، سعی کنید نظرات مشتری را در مباحث تجربهکاربری گوش بدهید، اما اجازه ندهید در مورد مباحث فنی نظری را ارائه کنند! مگر دلایل قانع کننده و اساسی که در شرایط خاص توسط مشاورین فنی در پروژههای بزرگ و اساسی پیشنهاد میشود.
8️⃣ در صورتی که در داخل یک تیم کار میکنید، تعامل تنها روش ممکن برای موفقیت است! بحث و جدال با همتیمیها هیچ فایدهای به جز نا رضایتی نخواهد داشت.
9️⃣ اگر با مشکلاتی مواجه میشوید که باعث میشود شما کم کاری کنید آن را باید مدیریت کنید! نگذارید مشتری شما احساس کند که هر موقع حوصله داشتید روی پروژهٔ او کار میکنید. بنابراین برای حفظ ارزشها و درک برای احترامهای متقابل حتماً از برنامهٔ زمانبندی شده برای مشتری خود ارائه کنید.
0️⃣1️⃣ عقد قرارداد و تفاهم نامه در رابطه با عدم افشای اطلاعات مهم است! اگر میخواهید حرفهای باشید و با شما حرفهای رفتار شود همیشه خودتان پیش قدم برای عقد قراردادهای تضمین شده برای دو طرف را باشید.
1️⃣1️⃣ سعی کنید پروژهای که واقعاً آن را دوست ندارید را انجام ندهید! برنامهنویسی باید همراه با لذت باشد، در غیر این صورت کار بر روی آن بسیار خستهکننده خواهد بود که باعث ناراحتی و مشکلات احتمالی خواهد شد؛ بنابراین سعی کنید توسعهٔ پروژه برای شما جذاب و لذت بخش باشد.
2️⃣1️⃣ برنامهنویسی شغل بسیار موثر و سطح بالایی در این دوره زمانه است، بنابراین طوری رفتار کنید که در شأن آن هستید و قدر آن را بدانید.
برنامهنویس حرفهای و واقعی هیچگاه پشت تلفن و با یک جلسه ملاقات هزینه و زمان برای انجام پروژه را مشخص نمیکند. بر خلاف انتظاری که مشتری از شما دارد، به هیچ عنوان نباید هزینههای زمانی و مالی را بدون تجزیه تحلیل اولیه بیان کنید. چرا که اگر مشتری شما واقعاً مصمم در انجام پروژهای باشد که هدفمند است، در این صورت حتماً از شما انتظار یاری و مشاروهٔ را خواهد داشت.
بنابراین توصیه میکنم، شدیداً به این نکته توجه داشته باشید که به هیچ عنوان در ملاقات اولیه و یا حتی در پشت تلفن قیمت و زمان برای پروژهٔ پیشنهادی از طرف مشتری ارائه نکنید. این نشانگر این است که شما به اندازهٔ کافی به زمان، مهارت و تخصص خود مطمئن نیستید.
پیشنهاد میشود هر پروژهای که به شما پیشنهاد شد، آن رو در یک زمان مناسب بررسی و مواردی که فکر میکنید نیاز است مشتری در جریان آن قرار بگیرد را به زبان سادهتر به او انتقال دهید.
1️⃣ ابتدا نیاز مشتری را به خوبی درک کنید، در قدم بعدی بررسی زمانی و سپس بررسی روشها و ابزارهایی که قرار است در توسعهٔ پروژه مورد استفاده برار بگیرد را برای خودتان مشخص کنید.
2️⃣ مهارت خود را همراه با دانش، اطلاعاتِ تکیه بر تجربیات خود برای پیادهسازیِ پروژهٔ پیشنهادی مرور کرده و آن را بر اساس نتیجهٔ حاصل شده ارزیابی کنید.
3️⃣ زمانی را که در طی چند ساعت، روز، هفته و ماه نیاز دارید به طور تقریبی و نزدیک به واقعیت محاسبه کنید. (زمان از نظر مشتری بسیار مهم است، او انتظار دارد در زمانی که شما طی کردهاید به نتیجه برسد).
4️⃣ قیمت را به صراحت و جدی برای مشتریِ خود مشخص کنید (مشخص کردن قیمت ترسی ندارد و شما باید واقعیت را بیان کنید) مهم نیست که مشتری چه واکنشی نشان خواهد داد. شما واقعیت را بیان کنید (بیان کردن واقعیت یعنی یک قدم برای تعریف ارزش برنامهنویسی به طرف مقابل) تا دیگر فرصتی برای بی ارزش کردن کار شما وجود نداشته باشد.
5️⃣ اگر مشتری با شنیدن هزینهٔ پیشنهادی شما جهت انجام کار شروع به مثال آوردن از برنامهنویسانی کرد که متخصص در این حوزه نیستند، مطمئن شوید که او ارزش پروژهٔ خود را به خوبی نمیداند. (اگر مشتری شخصیت انتقاد پذیری داشته باشد، میتوانید او را قانع کنید که کاملاً در اشتباه است) در غیر این صورت نباید در مورد هزینهها اصرار و تأکید داشته باشد، چرا که هزینهها بر اساس نیازها و معیار های واقعی مطرح میشوند.
5️⃣ تخفیف در برنامهنویسی در قدم اول معنی ندارد! در همان لحظه که احساس میکنید مشتریِ شما بیشتر به فکر هزینه است تا به فکر کیفیت، شک نکنید که در نهایت رضایت دو جانبهای وجود نخواهد داشت! چون این قرارداد یک طرفه و صرفاً بر اساس هزینهها بسته میشود.
6️⃣ به مشتری اطمینان خاطر بدهید که پروژهٔ او در بهترین حالت ممکن تولید خواهد شد! اگر بتوانید و اگر مهارت شما در حدی باشد که محصولی مشابه محصولات استاندارد و جهانی بسازید شک نکنید که موفق خواهید شد. تأکید میکنم مشتری در قدم اول هیچ کاری با کدهای شما ندارد و صرفاً منتظر نتیجهای است که باید ببیند و آن را حس و درک کند.
7️⃣ مشاوره را در هر مرحله از توسعهٔ پروژه در نظر بگیرید، سعی کنید نظرات مشتری را در مباحث تجربهکاربری گوش بدهید، اما اجازه ندهید در مورد مباحث فنی نظری را ارائه کنند! مگر دلایل قانع کننده و اساسی که در شرایط خاص توسط مشاورین فنی در پروژههای بزرگ و اساسی پیشنهاد میشود.
8️⃣ در صورتی که در داخل یک تیم کار میکنید، تعامل تنها روش ممکن برای موفقیت است! بحث و جدال با همتیمیها هیچ فایدهای به جز نا رضایتی نخواهد داشت.
9️⃣ اگر با مشکلاتی مواجه میشوید که باعث میشود شما کم کاری کنید آن را باید مدیریت کنید! نگذارید مشتری شما احساس کند که هر موقع حوصله داشتید روی پروژهٔ او کار میکنید. بنابراین برای حفظ ارزشها و درک برای احترامهای متقابل حتماً از برنامهٔ زمانبندی شده برای مشتری خود ارائه کنید.
0️⃣1️⃣ عقد قرارداد و تفاهم نامه در رابطه با عدم افشای اطلاعات مهم است! اگر میخواهید حرفهای باشید و با شما حرفهای رفتار شود همیشه خودتان پیش قدم برای عقد قراردادهای تضمین شده برای دو طرف را باشید.
1️⃣1️⃣ سعی کنید پروژهای که واقعاً آن را دوست ندارید را انجام ندهید! برنامهنویسی باید همراه با لذت باشد، در غیر این صورت کار بر روی آن بسیار خستهکننده خواهد بود که باعث ناراحتی و مشکلات احتمالی خواهد شد؛ بنابراین سعی کنید توسعهٔ پروژه برای شما جذاب و لذت بخش باشد.
2️⃣1️⃣ برنامهنویسی شغل بسیار موثر و سطح بالایی در این دوره زمانه است، بنابراین طوری رفتار کنید که در شأن آن هستید و قدر آن را بدانید.
مقایسه تکنولوژی استفاده شده در شرکت های بزرگ برنامه نویسی دنیا
توسط این سایت می توانید بهترین تکنولوژی، ابزار ها و فریمورک های مورد استفاده در شرکت های بزرگ برنامه نویسی دنیا را مشاهده و با یکدیگر مقایسه کنید.
https://stackshare.io/
مثلا لینک زیر تکنولوژی ها و ابزاری های مورد استفاده در شرکت Airbnb را نمایش می دهد.
https://stackshare.io/airbnb/airbnb
___________
توسط این سایت می توانید بهترین تکنولوژی، ابزار ها و فریمورک های مورد استفاده در شرکت های بزرگ برنامه نویسی دنیا را مشاهده و با یکدیگر مقایسه کنید.
https://stackshare.io/
مثلا لینک زیر تکنولوژی ها و ابزاری های مورد استفاده در شرکت Airbnb را نمایش می دهد.
https://stackshare.io/airbnb/airbnb
___________
❇️ بازنویسی یک برنامهی قدیمی Web Form با DDD، TDD و NET Core
پیشنهاد میکنم این مقاله طولانی رو بخونین، موارد خیلی زیادی رو به صورت عملی یاد میگیرین
فقط کافیه لیست تکنولوژی ها و معماری های استفاده شده رو ببینین تا به پر مایه بودنش پی ببرین
- #DDD & #CQRS
- Using CoreDdd (a library to work with DDD and CQRS.)
- #TDD & #Unit_Testing
- Using #NUnit (a unit test framework)
- Using #Shouldly (an assertion framework for NUnit)
- Using #Nhibernate ORM & CoreDdd.Nhibernate (for persistence layer)
- Using #FluentNHibernate (for database mappings)
- #Mocking & #Fake Services
- Using #FakeItEasy (an easy mocking framework)
- Adding ASP NET Core & built-in IOC Container
- #Command_Handler Pattern
- #Domain_Events Handler Pattern
- Domain Events Message Handler Pattern
- Adding #Message_Bus
- Using #Rebus & Rebus.Async (a message bus library)
- Using Await/Async for Performance Boost
🔸لینک مقاله :
https://bit.ly/2UpoW5F
🔹ریپازیتوری پروژه :
https://github.com/xhafan/legacy-to-coreddd
پیشنهاد میکنم این مقاله طولانی رو بخونین، موارد خیلی زیادی رو به صورت عملی یاد میگیرین
فقط کافیه لیست تکنولوژی ها و معماری های استفاده شده رو ببینین تا به پر مایه بودنش پی ببرین
- #DDD & #CQRS
- Using CoreDdd (a library to work with DDD and CQRS.)
- #TDD & #Unit_Testing
- Using #NUnit (a unit test framework)
- Using #Shouldly (an assertion framework for NUnit)
- Using #Nhibernate ORM & CoreDdd.Nhibernate (for persistence layer)
- Using #FluentNHibernate (for database mappings)
- #Mocking & #Fake Services
- Using #FakeItEasy (an easy mocking framework)
- Adding ASP NET Core & built-in IOC Container
- #Command_Handler Pattern
- #Domain_Events Handler Pattern
- Domain Events Message Handler Pattern
- Adding #Message_Bus
- Using #Rebus & Rebus.Async (a message bus library)
- Using Await/Async for Performance Boost
🔸لینک مقاله :
https://bit.ly/2UpoW5F
🔹ریپازیتوری پروژه :
https://github.com/xhafan/legacy-to-coreddd
کمپانی اینتل اخیرا از پردازندههای جدید نسل یازدهمی خود رونمایی کرد. این شرکت همزمان با عرضه پردازندههای مذکور به معرفی یک لوگوی مینیمالیستی جدید پرداخت. این لوگو سومین نمونه مورد استفاده توسط کمپانی تا به امروز محسوب میشود. این طراحی جدید جایگزین لوگوی قدیمی میشود که در آن واژه Intel درون یک دایره محصور شده است. لوگوی سابق از سال 2006 با اشکال مختلف از سوی کمپانی مورد بهرهبرداری قرار گرفته است.
همچنین لوگوی جدید با بهرهگیری از الگوی طراحی مینیمالیستیتر برای کلیه محصولات کمپانی از سرورهای Xeon گرفته تا تراشههای حافظه Optane به نماد تجاری اینتل جانی تازه میبخشد.
همچنین لوگوی جدید با بهرهگیری از الگوی طراحی مینیمالیستیتر برای کلیه محصولات کمپانی از سرورهای Xeon گرفته تا تراشههای حافظه Optane به نماد تجاری اینتل جانی تازه میبخشد.
❇️ مجموعه آموزش های Microservices در NET Core.
اگر در اینترنت به دنبال آموزش های Microservices گشته باشین متوجه میشین که اکثر مقالات یا به صورت کلی و عمومی هستند (نه مختص دات نت) و یا برای زبان های دیگه اند و در نهایت اونایی هم مختص دات نت باشن به صورت پراکنده در فضای اینترنت پخش شده اند
علاوه بر این، مبحث Microservices دارای موضوعات متعدد و بزرگی هست و نمیشه اون رو با یک یا چند مقاله جسته و گریخته یاد گرفت واسه همین به یک سری آموزش نیاز دارید.
همچنین بعد از یادگیری مفاهیم پایه این مبحث، بهترین چیزی که میتونه شما رو بر روی این موضوع مسلط کنه، بررسی سورس نمونه پروژه های واقعی که بر پایه Microservices و NET Core. نوشته شده اند هست
🔰ریپازیتوری زیر سعی کرده بهترین آموزش های Microservices که مختص NET Core. هستند رو گردآوری کنه و در پایان لیستی از پروژه های سورس باز گیتهاب که با این معماری نوشته شده اند رو جمع آوری کنه
اگر علاقمند به یادگیری Microservices در NET Core. هستید این بهترین منبع رایگانی هست که میتونه به شما کمک کنه
https://github.com/mjebrahimi/Awesome-Microservices-NetCore
__________
اگر در اینترنت به دنبال آموزش های Microservices گشته باشین متوجه میشین که اکثر مقالات یا به صورت کلی و عمومی هستند (نه مختص دات نت) و یا برای زبان های دیگه اند و در نهایت اونایی هم مختص دات نت باشن به صورت پراکنده در فضای اینترنت پخش شده اند
علاوه بر این، مبحث Microservices دارای موضوعات متعدد و بزرگی هست و نمیشه اون رو با یک یا چند مقاله جسته و گریخته یاد گرفت واسه همین به یک سری آموزش نیاز دارید.
همچنین بعد از یادگیری مفاهیم پایه این مبحث، بهترین چیزی که میتونه شما رو بر روی این موضوع مسلط کنه، بررسی سورس نمونه پروژه های واقعی که بر پایه Microservices و NET Core. نوشته شده اند هست
🔰ریپازیتوری زیر سعی کرده بهترین آموزش های Microservices که مختص NET Core. هستند رو گردآوری کنه و در پایان لیستی از پروژه های سورس باز گیتهاب که با این معماری نوشته شده اند رو جمع آوری کنه
اگر علاقمند به یادگیری Microservices در NET Core. هستید این بهترین منبع رایگانی هست که میتونه به شما کمک کنه
https://github.com/mjebrahimi/Awesome-Microservices-NetCore
__________
✅ #یک_نکته
ترجیحا متد های async را به روش sync و توسط Task.Wait و Task.Result فراخوانی نکنید زیرا باید block شدن ترد جاری شده و حتی میتواند باعث dead-lock شود.
ولی اگر جایی مجبور شدید به این صورت استفاده کنید (مثلا در سازنده کلاس زیرا نمی توان async/await استفاده کرد) به جای
در روش اول اگر خطایی رخ دهد استثنای صادر شده را در یک AggregateException محصور شده پرتاب میکند که بررسی Detail آن سخت تر و نامفهوم تر است ولی در روش دوم اگر خطایی رخ دهد یک Exception معمولی پرتاب میشود
منابع :
https://codurance.com/2018/12/06/wait-and-getawaiter/
https://stackoverflow.com/questions/17284517
_______________
ترجیحا متد های async را به روش sync و توسط Task.Wait و Task.Result فراخوانی نکنید زیرا باید block شدن ترد جاری شده و حتی میتواند باعث dead-lock شود.
ولی اگر جایی مجبور شدید به این صورت استفاده کنید (مثلا در سازنده کلاس زیرا نمی توان async/await استفاده کرد) به جای
task.Wait();
var result = task.Result;
حتما حتما از روش زیر استفاده کنید var result = task.GetAwaiter().GetResult();
این روش دقیقا مانند روش اول است حتی بحث dead-lock و blocking ترد هم صادق است ولی ...در روش اول اگر خطایی رخ دهد استثنای صادر شده را در یک AggregateException محصور شده پرتاب میکند که بررسی Detail آن سخت تر و نامفهوم تر است ولی در روش دوم اگر خطایی رخ دهد یک Exception معمولی پرتاب میشود
منابع :
https://codurance.com/2018/12/06/wait-and-getawaiter/
https://stackoverflow.com/questions/17284517
_______________
Codurance
Await vs GetAwaiter | Codurance
A tiny bit of async in your life. I have decided to talk about a little thing regarding the retrieval of results on C# while using async.