View Full Version : مدیریت درخواست های زیاد به برنامه در Entity Framework
spyknight2004
پنج شنبه 22 آذر 1397, 08:20 صبح
سلام دوستان
من در صفحات view برنامه ام، برای مدیریت دسترسی به اجزای مختلف صفحه از Razor استفاده کردم و امکان دسترسی به اونها رو بر اساس جدولی در دیتابیس چک میکنم.
مشکل اینجاست که اگر همزمان تعداد زیادی صفحه (مثلا 10 صفحه) با هم باز بشن برنامه کلا به خطا می خوره و با خطاهای Connection state is open یا Connection state is connecting روبرو میشم.
طبیعتا این تعداد صفحه زیاد نیست و برنامه باید بتونه این حجم درخواست رو مدیریت کنه اما نمی دونم چطوری باید این کار رو انجام بدم.
اصل مشکل هم در تابعی هست که همین دسترسی ها رو در چندتا جدول DB که یکی از جداول اونها تقریبا 2000 ردیف داده داره، داره چک میکنه.
داده ها هم به کمک LINQ در حال فراخوانی هستند. میشه منو راهنمایی کنید چطور جلوی این کندی و بروز خطا رو بگیرم؟ :اشتباه:
spyknight2004
شنبه 24 آذر 1397, 09:21 صبح
دوستان کسی هست که بتونه راهنمایی کنه؟
مهدی کرامتی
شنبه 24 آذر 1397, 10:57 صبح
من هم سیستم مشابهی (کنترل دسترسی بر اساس پرمیشن های ثبت شده در دیتابیس) در پروژه هام پیاده سازی کرده ام.
برای بررسی پرمیشن های کار نیاز نیست هر بار به دیتابیس مراجعه کنید. من هنگامی که کاربر لاگین میکنه و یا به عنوان یک کاربر لاگین شده به سایت وارد میشه در متد Session_Start در Global.asax دسترسی های کاربر رو تبدیل به یک لیست می کنم و داخل Session قرار میدم. هر بار نیاز به بررسی دسترسی است روی اون لیست کوئری میزنم. این طوری سرعت کار خیلی بالا میره.
spyknight2004
یک شنبه 25 آذر 1397, 12:48 عصر
من هم سیستم مشابهی (کنترل دسترسی بر اساس پرمیشن های ثبت شده در دیتابیس) در پروژه هام پیاده سازی کرده ام.
برای بررسی پرمیشن های کار نیاز نیست هر بار به دیتابیس مراجعه کنید. من هنگامی که کاربر لاگین میکنه و یا به عنوان یک کاربر لاگین شده به سایت وارد میشه در متد Session_Start در Global.asax دسترسی های کاربر رو تبدیل به یک لیست می کنم و داخل Session قرار میدم. هر بار نیاز به بررسی دسترسی است روی اون لیست کوئری میزنم. این طوری سرعت کار خیلی بالا میره.
خیلی ممنون از راهنمایی ارزشمندتون، فقط یه نکته، این موضوع از لحاظ امنیتی مساله ساز نیست؟ چون بحث امنیت در این سامانه مون خیلی مهمه و قرار تست امنیتی بشه. در چنین حالتی امکان جعل سشن برای کاربر دیگه ای وجود نداره؟
مهدی کرامتی
یک شنبه 25 آذر 1397, 13:45 عصر
برای انجام جعل سشن، فرد مهاجم میبایست از یکی از امکانات زیر برخوردار باشد:
به سیستم کاربر صاحب سشن دسترسی داشته باشد.
به روتر شبکه دسترسی ادمین داشته باشد.
از طریق Script Injection در سایت شما بتواند کوکی ها و دیگر شناسه های مدیریت کننده سشن را بخواند و در سرور/سایت خودش Save کند.
برخورداری از مورد 1 و 2 کار راحتی نیست.
و اما برای مقابله با Script Injection (معروف به XSS Attack):
اگر شما در جاهایی که مقادیری را از کاربران سایت در Input ها دریافت می کنید (منوط به اینکه با استفاده از صفتی مانند AllowHtml اجازه وارد کردن کد Html/Javascript را در آن Input داده باشید) با استفاده از امکانی مانند HtmlSanitizer ورودی را از کدهای آلوده تصفیه کنید هیچ گاه مشکل Script Injection را در سایت تان نخواهید داشت.
spyknight2004
دوشنبه 26 آذر 1397, 10:15 صبح
واقعا ازتون ممنونم که با حوصله و دقیق جوابم رو دادید.
من از روشی که گفته بودید هم استفاده کردم و لیست دسترسی های کاربر رو به صفحات مختلف در داخل یک لیست در داخل سشن نگهداری کردم و بعد در بخش های مربوطه از این لیست استفاده کردم. اما همچنان وقتی که چند درخواست همزمان به سمت سرور ارسال میشه برنامه قفل می کنه و تمام صفحات با کمی تاخیر به خطا می خورند. امکان استفاده از رویکرد غیرهمزمان (Async) هم متاسفانه وجود نداشت (چون به خروجی این متدها برای ادامه کار نیاز هست). به نظرم مشکل باید از جای دیگه ای باشه چون این خیلی طبیعی هست که همزمان تعداد زیادی درخواست برای باز کردن صفحه به سرور ارسال بشه.
یه نکته هم در مورد نحوه انجام تست بگم که شاید به اون ایراد وارد باشه، من و چند کاربر دیگه همزمان از روی سیستم های مختلف یک صفحه مشخص رو در چندین تب باز می کنیم تا اینطوری تا حدی تست فشار رو روی سامانه انجام بدیم، آیا رویکرد تست مون اشتباه هست که نتیجه ی درستی نمی گیریم؟
مهدی کرامتی
دوشنبه 26 آذر 1397, 11:40 صبح
سروری که در موردش صحبت می کنید یک وب سرور هست که از جایی تهیه کرده اید و یا یک سرور در شبکه محلی؟
spyknight2004
دوشنبه 26 آذر 1397, 15:49 عصر
بله یک سرور اختصاصی مربوط به شهرداری هست که ما در قالب یک VPS به اون دسترسی داریم. الان با ورود دو یا سه کاربر خیلی این احتمال وجود داره که خیلی زود با خطا مواجه بشیم. در حال حاضر با ورود دو یا سه کاربر دائما با خطای Connection state is open و connection state is connectiong و یا خطاهای مشابه اون که به کانکشن دیتابیس مربوط هست مواجه میشیم.
مهدی کرامتی
دوشنبه 26 آذر 1397, 15:53 عصر
1- کانکشن به دیتابیس رو خودتون دستی باز یا بسته می کنید؟
2- آیا از آبجکت DbContect متغیر استاتیک ساخته اید و از آن استفاده می کنید؟
spyknight2004
دوشنبه 26 آذر 1397, 16:20 عصر
1- کانکشن به دیتابیس رو خودتون دستی باز یا بسته می کنید؟
نه کانکشن ها رو به صورت دستی باز و بسته نمی کنیم.
2- آیا از آبجکت DbContect متغیر استاتیک ساخته اید و از آن استفاده می کنید؟
بله. از db در ابتدای هر کلاس یا کنترلر یک شی ساخته شده و از اون استفاده میشه
مهدی کرامتی
دوشنبه 26 آذر 1397, 17:28 عصر
ممکنه ورژنی از SQL Server که روی سرور شما نصبه نگارش پایین (مثلا Developer Edition) است و تعداد کانکشن های زیادی رو پشتیبانی نمی کنه.
همچنین، می توانید به صورت دستی کانکشن ها رو قبل از Query باز و بسته کنید:
context.Database.Connection.Open();
...
...
context.Database.Connection.Close();
spyknight2004
دوشنبه 26 آذر 1397, 18:19 عصر
ممکنه ورژنی از SQL Server که روی سرور شما نصبه نگارش پایین (مثلا Developer Edition) است و تعداد کانکشن های زیادی رو پشتیبانی نمی کنه.
نسخه ی روی سرور Enterprise هست و از اون جهت مشکلی نیست.
همچنین، می توانید به صورت دستی کانکشن ها رو قبل از Query باز و بسته کنید:
context.Database.Connection.Open();
...
...
context.Database.Connection.Close();
ممنون این رو هم امتحان میکنم.
مشکل با سوالی که از من پرسیدید حل شد. برای توابعی که در صفحاتم تعداد دفعات زیادی فراخوانی می شدند با استفاده از using یک Context جدید ساختم. هم سرعت بارگذاری صفحات خیلی خوب شد و هم تعداد خطاهای وابسته به این موضوع به صفر رسید. امیدوارم که راه درستی رو برای تست تحمل بار انتخاب کرده باشم.
از راهنمایی و حوصله ی شما در پاسخگویی تون خیلی متشکرم :قلب::قلب::قلب:
مهدی کرامتی
دوشنبه 26 آذر 1397, 18:25 عصر
خوشحالم که مشکلت حل شد :قلب:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.