عنوان:

‫اثر وجود سشن بر پردازش موازی در ASP.NET


نویسنده: وحید نصیری
تاریخ: ۱۳۹۱/۰۴/۰۳ ۱۰:۱۳
آدرس: www.dntips.ir
در حین جستجوی مطلبی در فوروم‌های ASP.NET، مطلبی رو از یکی از اعضای تیم ASP.NET دیدم که خلاصه‌اش به این شرح است:

اگر چندین درخواست با یک Session ID به موتور پردازشی ASP.NET وارد شوند و حداقل یکی از آن‌ها به صورت سشنی خواندنی+نوشتنی علامت گذاری شده باشد، اینگونه درخواست‌ها serialized می‌شود. به این معنا که این نوع درخواست‌ها در صف قرار داده شده و به ترتیب رسیدن، اجرا می‌شوند. این کار هم از این جهت لازم است که چندین درخواست یا به عبارتی چندین ترد همزمان، سبب انجام تغییرات ناخواسته‌ای در مقادیر سشن مورد استفاده نشوند.
و اگر چندین درخواست با یک Session ID به موتور پردازشی ASP.NET وارد شوند و تمام آن‌ها سشن «فقط خواندنی» باشند یا در آن‌ها سشن «غیرفعال» شده باشد، این درخواست‌ها به صورت موازی پردازش خواهند شد.

بنابراین اگر در برنامه خود از سشن استفاده نمی‌کنید، سطر زیر را به وب کانفیگ برنامه اضافه نمائید تا حداکثر استفاده را از پردازش موازی خودکار کرده باشید:

<httpModules>
   <remove name="Session"/>
</httpModules>

<sessionState mode="Off" />

و یا در ASP.NET MVC می‌توان کنترل ریزتری را به نحو زیر نیز اعمال کرد:
[SessionState(SessionStateBehavior.Disabled)]
public class AjaxTestController : Controller
{  
   //...
}
در اینجا تنها حالت سشن مرتبط با اکشن متدی (و یا تمام اکشن متدهای یک کنترلر) که برای درخواست‌های Ajax طراحی شده، خاموش گردیده است تا درخواست‌های غیرهمزمان Ajaxایی بتوانند حداکثر استفاده را از پردازش موازی خودکار کنند.
نکته دیگر اینکه اگر نیاز به استفاده از سشن در یک اکشن متد وجود داشته باشد می‌توان از فیلتر سشن‌های فقط خواندنی استفاده کرد تا باز هم به همان پردازش موازی پشت صحنه برسیم:
[SessionState(SessionStateBehavior.ReadOnly)]

نظرات

  • مهمان در ۱۳۹۱/۰۴/۰۳ ۱۱:۵۰
    با سلام و ممنون از سایت خیلی خوب شما
    سوالم اینه که آیا اگر بخوایم در یک برنامه asp.net از سشن استفاده کنیم و ان را در کل سایت readOnly اعلام کنیم تا بتونیم پردازش موازی داشته باشیم راهی هست که در وب کانفیگ این تنظیم را انجام دهیم ؟یا حتی هنگام تعریف اولیه سشن پس از مقدار دهی آنرا readOnly کنیم؟
    • وحید نصیری در ۱۳۹۱/۰۴/۰۳ ۱۲:۳
      در وب کانفیگ خیر. تعریف‌های انجام شده در وب کانفیگ سراسری است. به این معنا که اگر می‌شد سشن را در وب کانفیگ readonly کرد، بعد کجا باید در آن مقداری را درج می‌کردیم؟ بنابراین استفاده از سشن غیرممکن می‌شد؛ چون برنامه اجازه‌ی درج هیچ مقداری را در هیچ نوع سشنی نمی‌داد.
      جهت تکمیل بحث:
      در وب فرم‌ها هم امکان readonly کردن سشن مورد استفاده در یک صفحه وجود دارد :
      pagesSection.EnableSessionState = PagesEnableSessionState.ReadOnly

      <% @Page EnableSessionState="ReadOnly" %>
  • مهمان در ۱۳۹۱/۰۴/۰۳ ۱۵:۵۳
    آقای نصیری آیا استفاده از سشن در زمانی که کاربران زیاد هستند بار زیادی روی سرور ایجاد نمیکنه. تا چه تعداد کاربر رو میشه با سشن ساپورت کرد. مثلا همون اطلاعات یوزری که لاگین کرده؟
    • وحید نصیری در ۱۳۹۱/۰۴/۰۳ ۱۶:۱۴
      سؤال شما خارج از بحث پردازش موازی است. سشن به صورت پیش فرض در حافظه سرور ذخیره می‌شود بنابراین حد و حدود آن مشخص است. البته سشن را در ASP.NET می‌شود در SQL Server هم ذخیره کرد. کمی کندتر از حافظه است اما مشکل مقیاس پذیری آنچنانی نداره.

  • مهمان در ۱۳۹۱/۰۸/۲۳ ۲۰:۴
    سلام
    منظورتون از چندین درخواست یا یک sessionId یکسان به موتور asp.net برسند رو میشه توضیح بدید ؟
    آیا منظورتون از Session  همون Session[""] هست ؟
    • وحید نصیری در ۱۳۹۱/۰۸/۲۳ ۲۲:۴۶
      توضیحات بیشتر در مورد SessionId : (^)
  • مهمان در ۱۳۹۱/۱۰/۲۸ ۲۳:۵
    سلام
    من UserId کاربری که به سایت لاگین کرده رو در session نگه می‌دارم تا برای کارهای مختلف هربار به دیتابیس کوئری نزنم. آیا روش دیگری هست که بجای سشن بشه استفاده کرد (خصوصاً در MVC)
    • وحید نصیری در ۱۳۹۱/۱۰/۲۸ ۲۳:۲۰
      بله. از Forms authentication استفاده کنید.
      FormsAuthentication.SetAuthCookie(user.Id.ToString(CultureInfo.InvariantCulture), loginInfo.RememberMe);
      FormsAuthentication.RedirectFromLoginPage(user.Id.ToString(), loginInfo.RememberMe);
      بعد userId رو به شکل فوق تنظیم کنید. از این به بعد با مراجعه به شیء User به صورت User.Identity.Name به مقدار UserId خواهید رسید.
      • مهمان در ۱۳۹۱/۱۰/۲۸ ۲۳:۳۰
        ممنون، آیا اطلاعات دیگری را هم می‌شود با این روش ذخیره کرد، مثلا نام کاربر
        • وحید نصیری در ۱۳۹۱/۱۰/۲۸ ۲۳:۳۸
          کاری که در اینجا انجام میشه ذخیره اطلاعات به صورت رمزنگاری شده در یک کوکی است. رمزنگاری، ذخیره و مدیریت این کوکی (AuthCookie) خودکار است. در سایر موارد خودتون این مراحل مدیریت کوکی‌ها رو با کدنویسی شبیه سازی کنید.
          • مهمان در ۱۳۹۱/۱۰/۲۸ ۲۳:۳۹
            ممنون بابت راهنمایی خوبتون
  • رضا گرمارودی در ۱۳۹۲/۱۱/۱۹ ۱۱:۱۰
    سلام من واقعا متوجه نحوه استفاده یا عدم استفاده از Session‌ها نشدم!
    در Asp.net برای نگهداری یکسری از اطلاعات کاربر و یا هرگونه  اطلاعات مربوط به یک کاربر خاص از Session‌ها استفاده می‌کردیم.
    حال در Mvc  برای نگهداری هر گونه اطلاعات کاربر Login شده از چی باید استفاده کرد. اگر جواب کوکی هاست این کوکی‌ها در سمت کلاینت ثبت می‌شود و نیاز است که اطلاعات در سمت سرور باشد.
    کدم بهتره است : بخشی از حافظه برای اطلاعات کاربر جاری مصرف شود و درعوض در هر درخواستی از آن استفاده شود و یا خیر هربار این اطلاعات واکشی شود (البته بدون درنظر گرفتن سطح دوم کش).
    همچنین Session‌ها در Mvc با Session در Asp.net چه تفاوت هایی دارد؟
    ممنون میشم ابهام بنده را برطرف بفرمایید. 
    • وحید نصیری در ۱۳۹۲/۱۱/۱۹ ۱۱:۳۰
      - در سایت جاری ماژول سشن در وب کانفیگ کلا حذف شده. در هیچ‌جایی از آن از سشن استفاده نشده. (یک نمونه عملی)
      - به کوکی سمت کلاینت در سمت سرور دسترسی وجود دارد. مانند سیستم Forms Authentication که اساس آن استفاده از کوکی‌های رمزنگاری شده‌است؛ چه برای نگهداری اطلاعات کاربر لاگین شده به سیستم و چه برای نگهداری اطلاعات نقش‌های منتسب به او.
      - تفاوتی ندارند. یک هسته‌ی اصلی ASP.NET وجود دارد که حداقل دو فریم ورک وب فرمز و MVC از آن استفاده می‌کنند.
  • همراز در ۱۳۹۳/۰۹/۱۱ ۱۱:۰

    سلام؛  اگر بخواهیم از سشن استفاده نکنیم، برای نگهداری اطلاعات کسی که لاگین کرده چه راهی وجود داره؟ مثلاً UserId یا LoginId که با اون بشه به UserId رسید.

    • وحید نصیری در ۱۳۹۳/۰۹/۱۱ ۱۱:۲۴
      - در سایر نظرات مطلب جاری پیشتر بحث شده در این مورد.
      - هیچکدام از روش‌های مدرن authentication در ASP.NET از سشن استفاده نمی‌کنند. برای مثال از forms authentication و یا asp.net identity استفاده کنید.
  • ناظم در ۱۳۹۴/۰۳/۲۰ ۱۴:۴۲
    در iis 7  و بالاتر ظاهرا باید به این شکل عمل کرد:

      <system.webServer>
        <modules>
          <remove name="Session"/>
        </modules>
      </system.webServer>
  • علیرضا آرانی در ۱۴۰۲/۰۹/۰۶ ۱۲:۳۵
    در یکی از پروژه هایی که جدیدا باهاش درگیر شده ام دقیقا این مطلب رعایت نشده است. با ASP.NET WebForm نوشته شده و در یک صفحه هم از سشن به کرات استفاده شده برای مقاصد لاگین و متغیرهای سراسری و همچنین از چند ترد برای دریافت موازی اطلاعات از چند وب سرویس.
    اما برای دفاع، منبع خوبی پیدا نمی‌کنم برای ارایه به کارفرما. فرومی که لینک دادید هم داخلش یک لینک هست برای mvc اما صفحه ارور ۴۰۳ میده. آیا سند معتبری هم هست برای ارایه به افراد ثالث؟
    • سیروان عفیفی در ۱۴۰۲/۰۹/۰۶ ۱۳:۳۴
      لینک همین مطلب رو بفرستید.