eitaa logo
پروژه ASP.Net Core MVC (وب و سی شارپ)
121 دنبال‌کننده
168 عکس
38 ویدیو
376 فایل
❁﷽❁ آموزش 📖 برنامه نویسی ASP.Net Core MVC (وب و سی شارپ) Admin: @alialirezapanahi برنامه نویسی برنامه نویسی سی شارپ eitaa.com/sisharpapp برنامه نویسی وب eitaa.com/aspdatnet ویراستی virasty.com/alialirezapanahi آپارات aparat.com/alialirezapanahi
مشاهده در ایتا
دانلود
الگوی CQRS (Command Query Responsibility Segregation) یک الگوی طراحی نرم‌افزار است که مسئولیت‌های مربوط به به‌روزرسانی داده‌ها (کامندها) و خواندن داده‌ها (کوئری‌ها) را از هم جدا می‌کند. این الگو به شما کمک می‌کند تا اپلیکیشن‌های پیچیده و مقیاس‌پذیرتری بسازید. اصول CQRS کامند (Command): مسئول به‌روزرسانی وضعیت سیستم است. کامندها شامل عملیات‌هایی مانند ایجاد، به‌روزرسانی و حذف داده‌ها هستند. کوئری (Query): مسئول خواندن و بازیابی داده‌ها از سیستم است. کوئری‌ها فقط داده‌ها را بازیابی می‌کنند و هیچ‌گونه تغییر یا به‌روزرسانی در وضعیت سیستم ایجاد نمی‌کنند. مزایای استفاده از CQRS جداسازی مسئولیت‌ها: با جدا کردن منطق کامند و کوئری، می‌توانید کد خواناتر و قابل نگهداری‌تری ایجاد کنید. بهبود کارایی و مقیاس‌پذیری: می‌توانید از پایگاه‌های داده‌ی جداگانه برای عملیات خواندن و نوشتن استفاده کنید تا کارایی و مقیاس‌پذیری سیستم را بهبود ببخشید. تست‌پذیری بهتر: جداسازی منطق کامند و کوئری، تست‌پذیری و قابل اعتماد بودن کدها را افزایش می‌دهد. مثال: سرویس‌های کامند و کوئری بیایید دو سرویس کامند و کوئری ساده را بررسی کنیم. سرویس کامند: ایجاد یک مشتری جدید public class CreateCustomerCommand { public string Name { get; set; } public string Email { get; set; } } public class CreateCustomerCommandHandler { private readonly DatabaseContext _context; public CreateCustomerCommandHandler(DatabaseContext context) { _context = context; } public void Handle(CreateCustomerCommand command) { var customer = new Customer { Name = command.Name, Email = command.Email }; _context.Customers.Add(customer); _context.SaveChanges(); } } سرویس کوئری: دریافت اطلاعات مشتریان public class GetCustomersQuery { } public class GetCustomersQueryHandler { private readonly DatabaseContext _context; public GetCustomersQueryHandler(DatabaseContext context) { _context = context; } public List<CustomerDto> Handle(GetCustomersQuery query) { return _context.Customers .Select(c => new CustomerDto { Id = c.Id, Name = c.Name, Email = c.Email }) .ToList(); } } نتیجه‌گیری الگوی CQRS با جداسازی مسئولیت‌های مربوط به به‌روزرسانی و خواندن داده‌ها، به شما کمک می‌کند تا اپلیکیشن‌های پیچیده و مقیاس‌پذیرتری بسازید. این الگو همچنین بهبود کارایی، مقیاس‌پذیری و تست‌پذیری سیستم را فراهم می‌کند.
دیزاین پترن (الگوی طراحی) Facade یکی از الگوهای ساختاری در برنامه‌نویسی شیءگرا است. هدف اصلی این الگو ساده‌سازی و پنهان کردن پیچیدگی‌های یک سیستم توسط ارائه یک واسط ساده و یکپارچه است. بیایید با جزئیات بیشتری به بررسی این الگو بپردازیم. مفهوم Facade الگوی طراحی Facade یک واسط (interface) ساده و یکپارچه را برای مجموعه‌ای از اینترفیس‌های پیچیده در یک زیرسیستم فراهم می‌کند. این الگو به کاربران سیستم اجازه می‌دهد تا بدون نیاز به درک پیچیدگی‌ها و جزئیات زیرسیستم، از آن استفاده کنند. کاربردهای Facade ساده‌سازی استفاده از سیستم‌های پیچیده: با فراهم کردن یک واسط ساده، استفاده از سیستم‌های پیچیده را راحت‌تر می‌کند. پنهان کردن جزئیات پیاده‌سازی: جزئیات داخلی و پیچیده سیستم را از کاربران پنهان می‌کند و یک واسط ساده برای تعامل با سیستم ارائه می‌دهد. کاهش وابستگی‌ها: با استفاده از Facade، وابستگی‌ها به اجزای داخلی سیستم کاهش می‌یابد و امکان تغییرات در زیرسیستم بدون تأثیر بر کاربران فراهم می‌شود. مثال از الگوی Facade فرض کنید یک سیستم پیچیده برای مدیریت کتابخانه دارید که شامل چندین کلاس برای مدیریت کتاب‌ها، اعضا، وام‌دهی و برگرداندن کتاب‌ها است. می‌توانید یک Facade برای ساده‌سازی استفاده از این سیستم ایجاد کنید. // کلاس های زیرسیستم پیچیده public class BookManager { public void AddBook(string title) { /* اضافه کردن کتاب */ } public void RemoveBook(string title) { /* حذف کتاب */ } } public class MemberManager { public void AddMember(string name) { /* اضافه کردن عضو */ } public void RemoveMember(string name) { /* حذف عضو */ } } public class LoanManager { public void LendBook(string title, string memberName) { /* وام دادن کتاب */ } public void ReturnBook(string title, string memberName) { /* برگرداندن کتاب */ } } // کلاس Facade برای ساده‌سازی استفاده public class LibraryFacade { private readonly BookManager _bookManager; private readonly MemberManager _memberManager; private readonly LoanManager _loanManager; public LibraryFacade() { _bookManager = new BookManager(); _memberManager = new MemberManager(); _loanManager = new LoanManager(); } public void AddBookToLibrary(string title) { _bookManager.AddBook(title); } public void RemoveBookFromLibrary(string title) { _bookManager.RemoveBook(title); } public void AddMemberToLibrary(string name) { _memberManager.AddMember(name); } public void LendBookToMember(string title, string memberName) { _loanManager.LendBook(title, memberName); } public void ReturnBookFromMember(string title, string memberName) { _loanManager.ReturnBook(title, memberName); } } نتیجه‌گیری الگوی طراحی Facade به شما کمک می‌کند تا سیستم‌های پیچیده را با ارائه یک واسط ساده و یکپارچه، ساده‌تر کنید و استفاده از آن‌ها را برای کاربران راحت‌تر کنید. با استفاده از این الگو، می‌توانید وابستگی‌ها را کاهش دهید و جزئیات داخلی سیستم را پنهان کنید.
SweetAlert2 یک ابزار رایگان و قابل‌تنظیم برای جایگزینی پنجره‌های پیش‌فرمال جاوااسکریپت است. این ابزار به شما اجازه می‌دهد تا پنجره‌های زیبا، پاسخ‌گو و قابل‌تنظیم برای نمایش پیام‌ها، تاییدیه‌ها و اعلان‌ها ایجاد کنید. ویژگی‌های اصلی SweetAlert2: پاسخ‌گویی و تاییدیه: امکان ایجاد پنجره‌های تاییدیه و پاسخ‌گویی با چندین گزینه مختلف. قابل‌تنظیم: امکان تنظیم ظاهر، متن، تصاویر، ایکون‌ها و انتظار‌ها. بازدارنده‌های متناسب: پاسخ‌گویی و تاییدیه‌ها به طور متناسب با اندازه صفحه هستند. قابلیت دسترسی: پشتیبانی از استانداردهای دسترسی و امکان استفاده از WAI-ARIA. لینک به سایت SweetAlert2: SweetAlert2 نمونه کد: javascript Swal.fire({ title: 'هل شما مطمئن هستید؟', text: 'شما نمی‌توانید این عملیات را بازگردانی کنید!', icon: 'warning', showCancelButton: true, confirmButtonText: 'بله، حذف کنید', cancelButtonText: 'خیر، لغو کنید' }).then((result) => { if (result.isConfirmed) { Swal.fire('حذف شد!', 'فایل شما حذف شد.', 'success'); } else if (result.isDenied) { Swal.fire('لغو شد!', 'فایل شما از حذف خلاص شد.', 'info'); } آدرس سایت: https://sweetalert2.github.io/
این یک سوال مهم و حیاتی در مدیریت داده‌ها است. بسته به قوانین حفظ حریم خصوصی و نیازهای تجاری، روش‌های مختلفی برای مدیریت درخواست‌های حذف اطلاعات وجود دارد. بیایید به هر دو روش حذف و غیر فعال کردن اطلاعات و همچنین مدیریت بکاپ‌های داده‌ها بپردازیم: 1. حذف اطلاعات از دیتابیس مزایا: داده‌ها به طور کامل حذف می‌شوند و هیچ اثری از آن‌ها باقی نمی‌ماند، که می‌تواند از نظر امنیتی و حفظ حریم خصوصی مزیت باشد. معایب: ممکن است اطلاعات مورد نیاز برای گزارش‌های تاریخی یا بازگشت از مشکلات به طور کامل از دست برود. مثال: csharp public void DeleteCustomer(long customerId) { var customer = _context.Customers.Find(customerId); if (customer != null) { _context.Customers.Remove(customer); _context.SaveChanges(); } } 2. غیر فعال کردن اطلاعات (Soft Delete) مزایا: اطلاعات به طور فیزیکی از دیتابیس حذف نمی‌شوند، اما به طور منطقی غیر فعال می‌شوند، که به شما امکان می‌دهد در صورت نیاز دوباره به آن‌ها دسترسی داشته باشید. امکان نگهداری تاریخچه و گزارش‌های تاریخی. معایب: ممکن است حجم دیتابیس افزایش یابد و نیاز به فضای بیشتری برای ذخیره‌سازی داده‌های غیر فعال باشد. مثال: csharp public void DeactivateCustomer(long customerId) { var customer = _context.Customers.Find(customerId); if (customer != null) { customer.IsActive = false; // فرض کنید ستون IsActive برای نشانه‌گذاری مشتری‌های غیرفعال وجود دارد _context.SaveChanges(); } } 3. مدیریت بکاپ‌ها بکاپ‌های دیتابیس معمولاً برای بازیابی اطلاعات در صورت بروز مشکلات استفاده می‌شوند. اما در هنگام درخواست‌های حذف داده‌ها، باید این موارد را در نظر بگیرید: حذف اطلاعات از بکاپ‌ها: این ممکن است پیچیده و زمان‌بر باشد و در بیشتر موارد عملی نیست. نگهداری بکاپ‌ها: برخی از قوانین ممکن است الزام کنند که بکاپ‌ها باید تا مدت معینی نگهداری شوند. اطلاع‌رسانی به کاربران: کاربران را مطلع کنید که اطلاعات آن‌ها ممکن است تا مدت معینی در بکاپ‌ها نگهداری شود. راهکار پیشنهادی استفاده از Soft Delete: استفاده از روش غیر فعال کردن اطلاعات (Soft Delete) برای حفظ تاریخچه و مدیریت آسان‌تر داده‌ها. بازنگری بکاپ‌ها: بررسی قوانین و نیازهای کسب‌وکار برای تعیین مدت زمان نگهداری بکاپ‌ها. اطلاع‌رسانی شفاف: اطلاع‌رسانی به کاربران درباره روش‌های مدیریت اطلاعات و مدت زمان نگهداری داده‌ها در بکاپ‌ها. نتیجه‌گیری با انتخاب روش مناسب برای مدیریت درخواست‌های حذف اطلاعات و مدیریت صحیح بکاپ‌ها، می‌توانید از حفظ حریم خصوصی کاربران و رعایت قوانین اطمینان حاصل کنید. هر دو روش حذف فیزیکی و غیر فعال کردن اطلاعات مزایا و معایب خود را دارند، بنابراین باید با توجه به نیازهای خاص پروژه و قوانین مرتبط، بهترین روش را انتخاب کنید.
ساختار درختی کتگوری (Category Tree Structure) در بسیاری از سیستم‌های مدیریت محتوا و دیتابیس‌ها استفاده می‌شود تا دسته‌بندی‌ها و زیر دسته‌بندی‌ها را به صورت سلسله‌مراتبی مدیریت کند. این نوع ساختار به کاربران کمک می‌کند تا به راحتی به دسته‌ها و زیردسته‌ها دسترسی پیدا کنند و اطلاعات را به صورت سازمان‌دهی‌شده نمایش دهند. تعریف ساختار درختی کتگوری ساختار درختی کتگوری شامل یک ریشه (root) و مجموعه‌ای از گره‌ها (nodes) است که هر گره می‌تواند صفر یا چند فرزند (children) داشته باشد. هر گره نمایانگر یک دسته (category) یا زیردسته (subcategory) است. بیایید یک مثال عملی از این ساختار را بررسی کنیم. ساختار دیتابیس برای دسته‌ها و زیر دسته‌ها برای ایجاد این ساختار در یک دیتابیس رابطه‌ای، معمولاً یک جدول واحد با رابطه‌های خودی (self-referencing) استفاده می‌شود. این جدول می‌تواند به شکل زیر تعریف شود: sql CREATE TABLE Categories ( Id INT PRIMARY KEY, Name NVARCHAR(100) NOT NULL, ParentId INT NULL, FOREIGN KEY (ParentId) REFERENCES Categories(Id) ); نمونه داده‌ها برای نمایش ساختار درختی، می‌توانید داده‌های زیر را به جدول اضافه کنید: sql INSERT INTO Categories (Id, Name, ParentId) VALUES (1, 'Electronics', NULL); INSERT INTO Categories (Id, Name, ParentId) VALUES (2, 'Computers', 1); INSERT INTO Categories (Id, Name, ParentId) VALUES (3, 'Laptops', 2); INSERT INTO Categories (Id, Name, ParentId) VALUES (4, 'Smartphones', 1); INSERT INTO Categories (Id, Name, ParentId) VALUES (5, 'Home Appliances', NULL); INSERT INTO Categories (Id, Name, ParentId) VALUES (6, 'Refrigerators', 5); نمایش ساختار درختی با استفاده از این داده‌ها، ساختار درختی به صورت زیر نمایش داده می‌شود: Electronics |-- Computers | |-- Laptops |-- Smartphones Home Appliances |-- Refrigerators پیاده‌سازی در کد در زبان‌های برنامه‌نویسی مختلف، می‌توانید این ساختار را به راحتی پیاده‌سازی کنید. به عنوان مثال، در C# می‌توانید از کلاس‌های زیر استفاده کنید: csharp public class Category { public int Id { get; set; } public string Name { get; set; } public int? ParentId { get; set; } public List<Category> SubCategories { get; set; } public Category() { SubCategories = new List<Category>(); } } public class CategoryTree { public List<Category> Categories { get; set; } public CategoryTree() { Categories = new List<Category>(); } public void AddCategory(Category category) { if (category.ParentId == null) { Categories.Add(category); } else { var parentCategory = FindCategoryById(category.ParentId.Value, Categories); parentCategory?.SubCategories.Add(category); } } private Category FindCategoryById(int id, List<Category> categories) { foreach (var category in categories) { if (category.Id == id) { return category; } var subCategory = FindCategoryById(id, category.SubCategories); if (subCategory != null) { return subCategory; } } return null; } } نتیجه‌گیری ساختار درختی کتگوری به شما اجازه می‌دهد تا دسته‌بندی‌ها و زیردسته‌ها را به صورت سازمان‌دهی‌شده و سلسله‌مراتبی مدیریت کنید. این ساختار به کاربران کمک می‌کند تا به راحتی به دسته‌ها و زیردسته‌ها دسترسی پیدا کنند و اطلاعات را به شکل منظمی نمایش دهند.
استفاده از بلوک‌های Try-Catch در مدیریت خطا یکی از ابزارهای حیاتی در توسعه نرم‌افزار است. با این حال، استفاده نادرست یا بیش از حد از آن‌ها می‌تواند مشکلاتی به وجود آورد. در اینجا دلایلی آورده شده که چرا باید با احتیاط از Try-Catch استفاده کنیم و بهترین شیوه‌های مدیریت خطا را به کار ببریم: مشکلات استفاده نادرست از Try-Catch پنهان کردن خطاها: استفاده نادرست از Try-Catch می‌تواند منجر به پنهان کردن خطاها شود، به طوری که خطاهای واقعی شناسایی و رفع نشوند. این مسئله می‌تواند مشکلات بیشتری در کد به وجود آورد. کاهش کارایی: استفاده زیاد از Try-Catch می‌تواند باعث کاهش کارایی برنامه شود، زیرا مدیریت استثناها هزینه بالایی دارد. پیچیدگی کد: استفاده بیش از حد از Try-Catch می‌تواند کد را پیچیده و ناخوانا کند، که باعث کاهش قابلیت نگهداری و درک آن می‌شود. بهترین شیوه‌های مدیریت خطا استفاده محدود از Try-Catch: بلوک‌های Try-Catch را در جاهایی استفاده کنید که واقعاً نیاز است. مثلا در مواقعی که کد با منابع خارجی مانند فایل‌ها، شبکه، یا پایگاه داده در تعامل است. ثبت و گزارش خطاها: زمانی که خطایی رخ می‌دهد، آن را ثبت کنید تا بتوانید بعداً آن را بررسی و رفع کنید. استفاده از لاگ‌گیری (logging) ابزارهای مفیدی مانند NLog، Serilog یا Log4Net می‌تواند بسیار مفید باشد. csharp try { // کد حساس به خطا } catch (Exception ex) { // ثبت خطا logger.LogError(ex, "An error occurred"); throw; // برای دوباره پرتاب کردن خطا تا در سطح بالاتر مدیریت شود } مدیریت خطاهای خاص: بهتر است به جای گرفتن خطاهای عمومی (Exception)، خطاهای خاص را بگیرید و مدیریت کنید. csharp try { // کد حساس به خطا } catch (FileNotFoundException ex) { // مدیریت خطای فایل logger.LogError(ex, "File not found"); } catch (IOException ex) { // مدیریت خطاهای ورودی/خروجی logger.LogError(ex, "IO error occurred"); } catch (Exception ex) { // مدیریت سایر خطاها logger.LogError(ex, "An unexpected error occurred"); throw; } استفاده از الگوهای طراحی مناسب: استفاده از الگوهای طراحی مانند الگوی Retry یا الگوی Circuit Breaker می‌تواند به مدیریت خطاها در سیستم‌های توزیع‌شده کمک کند. نمایش پیام‌های خطای مناسب به کاربران: پیام‌های خطا باید برای کاربران قابل فهم باشند و اطلاعاتی که بتوانند از آن برای رفع مشکل استفاده کنند ارائه دهند. اما نباید جزئیات فنی را نمایش دهند که ممکن است امنیت سیستم را به خطر بیاندازند. نتیجه‌گیری استفاده از Try-Catch برای مدیریت خطا در برنامه‌ها ضروری است، اما باید به صورت منطقی و با احتیاط از آن‌ها استفاده شود. با پیروی از بهترین شیوه‌های مدیریت خطا، می‌توانید کد خود را پایدارتر، قابل نگهداری‌تر و کارآمدتر کنید.
انتخاب نام‌های مناسب برای پروژه‌ها و اجزاء مختلف آن، به ویژه در پروژه‌های بزرگ، می‌تواند چالش‌برانگیز باشد. استفاده از یک الگوی نام‌گذاری واضح و ثابت می‌تواند به شما کمک کند تا پروژه‌ها را به سادگی مدیریت کنید و اجزاء مختلف را به راحتی پیدا کنید. در اینجا چند راهنمایی برای نام‌گذاری پروژه‌ها و اجزاء مختلف آن آورده شده است: راهنمایی‌های کلی برای نام‌گذاری نام‌های معنادار: همیشه نام‌هایی را انتخاب کنید که واضح و معنادار باشند. این نام‌ها باید به طور دقیق توضیح دهند که کد یا فایل چه کاری انجام می‌دهد. عدم استفاده از اختصارات نامفهوم: از اختصاراتی که برای دیگران مبهم هستند، اجتناب کنید. اگر لازم است از اختصارات استفاده کنید، مطمئن شوید که آن‌ها برای همه اعضای تیم قابل فهم هستند. ثبات در نام‌گذاری: از یک الگوی نام‌گذاری ثابت در سراسر پروژه استفاده کنید تا کد خواناتر و قابل نگهداری‌تر شود. الگوهای نام‌گذاری متداول پروژه‌ها نام شرکت یا تیم + نام پروژه: به عنوان مثال، MyCompany.ProjectX یا TeamA.TaskManager. محیط توسعه: اگر پروژه‌ها به محیط‌های مختلف (توسعه، تست، تولید) متصل هستند، می‌توانید این مورد را نیز در نام‌گذاری لحاظ کنید. مثلاً، ProjectX.Dev, ProjectX.Test, ProjectX.Prod. پوشه‌ها و فایل‌ها ماژول‌ها و ویژگی‌ها: پوشه‌ها و فایل‌ها را بر اساس ماژول‌ها یا ویژگی‌های پروژه نام‌گذاری کنید. به عنوان مثال، Authentication, UserManagement, Billing. الگوی نام‌گذاری کلاس‌ها: از الگوهای نام‌گذاری مناسب برای کلاس‌ها استفاده کنید. به عنوان مثال، CustomerService, OrderController, PaymentRepository. توابع و متدها افعال واضح و معنادار: نام توابع و متدها باید افعالی باشند که عملکرد آن‌ها را توضیح دهند. به عنوان مثال، GetCustomerById, UpdateOrderStatus, ProcessPayment. متغیرها معنادار و توصیفی: نام متغیرها باید معنادار و توصیفی باشند. به عنوان مثال، customerName, orderTotal, paymentStatus. ابزارها و روش‌های کمکی تولید مستندات: استفاده از ابزارهای مستند‌سازی مانند Swagger یا XML Documentation در .NET می‌تواند به شما کمک کند تا نام‌ها و عملکردها را توضیح دهید و مستندات پروژه را بهبود بخشید. نرم‌افزارهای مدیریت پروژه: استفاده از نرم‌افزارهای مدیریت پروژه مانند JIRA یا Trello می‌تواند به شما کمک کند تا پروژه‌های خود را سازماندهی کنید و اجزاء مختلف را به راحتی پیدا کنید. بازنگری کد: انجام بازنگری‌های منظم کد (Code Review) می‌تواند به بهبود نام‌گذاری‌ها و اطمینان از استفاده از الگوهای ثابت کمک کند. نتیجه‌گیری با استفاده از این راهنمایی‌ها و الگوهای نام‌گذاری، می‌توانید پروژه‌های خود را به طور موثرتر مدیریت کنید و اطمینان حاصل کنید که نام‌ها معنادار و قابل درک هستند. این کار به شما کمک می‌کند تا بهره‌وری خود و تیم‌تان را افزایش دهید و مشکلات مربوط به یافتن اجزاء مختلف پروژه را کاهش دهید.
کوکی‌ها (Cookies) فایل‌های کوچکی هستند که در مرورگر کاربران ذخیره می‌شوند و به وب‌سایت‌ها اجازه می‌دهند تا اطلاعاتی مانند تنظیمات کاربر، سشن‌ها، و اطلاعات دیگر را نگهداری کنند. در پروژه‌های ASP.NET Core، کوکی‌ها به طور گسترده برای مدیریت سشن‌ها، احراز هویت، و نگهداری اطلاعات تنظیمات کاربر استفاده می‌شوند. استفاده از کوکی‌ها در ASP.NET Core بیایید با جزئیات بیشتری به نحوه استفاده از کوکی‌ها در ASP.NET Core بپردازیم: 1. ذخیره‌سازی کوکی برای ذخیره‌سازی کوکی در ASP.NET Core، می‌توانید از متد HttpContext.Response.Cookies.Append استفاده کنید. مثال: csharp public IActionResult SetCookie() { // ایجاد و ذخیره‌سازی کوکی HttpContext.Response.Cookies.Append("MyCookie", "CookieValue", new CookieOptions { Expires = DateTime.Now.AddDays(7) // تنظیم تاریخ انقضا }); return Ok("Cookie has been set"); } 2. خواندن کوکی برای خواندن کوکی از درخواست کاربر، می‌توانید از متد HttpContext.Request.Cookies استفاده کنید. مثال: csharp public IActionResult GetCookie() { // خواندن کوکی if (HttpContext.Request.Cookies.TryGetValue("MyCookie", out string cookieValue)) { return Ok($"Cookie Value: {cookieValue}"); } return NotFound("Cookie not found"); } 3. حذف کوکی برای حذف کوکی، می‌توانید از متد HttpContext.Response.Cookies.Delete استفاده کنید. مثال: csharp public IActionResult DeleteCookie() { // حذف کوکی HttpContext.Response.Cookies.Delete("MyCookie"); return Ok("Cookie has been deleted"); } استفاده از کوکی‌ها برای احراز هویت ASP.NET Core از کوکی‌ها برای مدیریت احراز هویت کاربران استفاده می‌کند. شما می‌توانید از سرویس‌های Identity و Authentication برای مدیریت این کار استفاده کنید. پیکربندی احراز هویت کوکی ابتدا باید سرویس احراز هویت کوکی را در متد ConfigureServices در Startup.cs پیکربندی کنید. مثال: csharp public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = "/Account/Login"; options.LogoutPath = "/Account/Logout"; options.AccessDeniedPath = "/Account/AccessDenied"; }); services.AddControllersWithViews(); } استفاده از احراز هویت کوکی سپس می‌توانید از احراز هویت کوکی برای لاگین و لاگ‌آوت کاربران استفاده کنید. مثال لاگین: csharp public async Task<IActionResult> Login(LoginViewModel model) { if (ModelState.IsValid) { var claims = new List<Claim> { new Claim(ClaimTypes.Name, model.Username), new Claim("FullName", model.FullName), new Claim(ClaimTypes.Role, "Administrator") }; var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); var authProperties = new AuthenticationProperties { IsPersistent = model.RememberMe }; await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties); return RedirectToAction("Index", "Home"); } return View(model); } مثال لاگ‌آوت: csharp public async Task<IActionResult> Logout() { await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); return RedirectToAction("Index", "Home"); } نتیجه‌گیری کوکی‌ها ابزار قدرتمندی برای مدیریت سشن‌ها، احراز هویت و نگهداری اطلاعات کاربر در وب‌سایت‌ها هستند. با استفاده از ASP.NET Core می‌توانید به راحتی کوکی‌ها را ذخیره، خواندن، و حذف کنید و همچنین از آن‌ها برای احراز هویت کاربران استفاده کنید.
تحلیل کد csharp public IActionResult Index() { Response.Cookies.Append("Message", "welcome", new CookieOptions { HttpOnly = true, Secure = Request.IsHttps, Path = Request.PathBase.HasValue ? Request.PathBase.ToString() : "/", Expires = DateTime.Now.AddDays(5), }); return View(); } توضیحات خط به خط کد: public IActionResult Index(): این متد یک اکشن در کنترلر است که زمانی که درخواست به مسیر مربوطه (مثلاً /Home/Index) ارسال می‌شود، اجرا می‌شود. Response.Cookies.Append("Message", "welcome", new CookieOptions { ... }): این خط یک کوکی جدید به نام Message با مقدار welcome ایجاد و به پاسخ (Response) اضافه می‌کند. CookieOptions: HttpOnly = true: این گزینه تعیین می‌کند که کوکی فقط از طریق HTTP قابل دسترسی است و از طریق جاوااسکریپت قابل دسترسی نیست. این ویژگی به افزایش امنیت کوکی کمک می‌کند. Secure = Request.IsHttps: این گزینه تعیین می‌کند که کوکی فقط در ارتباطات امن (HTTPS) ارسال شود. اگر درخواست (Request) از طریق HTTPS باشد، این مقدار true خواهد بود. Path = Request.PathBase.HasValue ? Request.PathBase.ToString() : "/": این گزینه مسیر کوکی را تعیین می‌کند. اگر PathBase موجود باشد، از آن استفاده می‌شود؛ در غیر این صورت مسیر ریشه (/) استفاده می‌شود. Expires = DateTime.Now.AddDays(5): این گزینه تعیین می‌کند که کوکی تا پنج روز معتبر باشد. پس از پنج روز، کوکی منقضی می‌شود. return View(): این خط تعیین می‌کند که اکشن به نمای (View) مربوطه پاسخ دهد و صفحه وب مورد نظر نمایش داده شود. قسمت بازرسی (Inspect) در مرورگر - بخش Storage برای مشاهده و بررسی کوکی‌ها در مرورگر، می‌توانید از ابزارهای توسعه‌دهنده (Developer Tools) استفاده کنید. در زیر به توضیحات بخش‌های مختلف مربوط به کوکی‌ها در قسمت Storage می‌پردازیم: Name: نام کوکی، در اینجا Message. Value: مقدار کوکی، در اینجا welcome. Domain: دامنه‌ای که کوکی برای آن تنظیم شده است. به طور پیش‌فرض، دامنه سایت فعلی است. Path: مسیری که کوکی برای آن تنظیم شده است. در این مثال، مسیر تعیین شده بر اساس Request.PathBase یا ریشه / است. Expires / Max-Age: تاریخ انقضای کوکی، که در اینجا پنج روز پس از زمان فعلی تنظیم شده است. Size: اندازه کوکی بر حسب بایت. HttpOnly: نشان‌دهنده این است که کوکی فقط از طریق HTTP قابل دسترسی است و از طریق جاوااسکریپت قابل دسترسی نیست. Secure: نشان‌دهنده این است که کوکی فقط در ارتباطات امن (HTTPS) ارسال می‌شود. SameSite: تعیین می‌کند که آیا کوکی تنها در درخواست‌های یکسان ارسال شود یا خیر. در این مثال، این ویژگی تنظیم نشده است.