اثر وجود سشن بر پردازش موازی در ASP.NET
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه

در حین جستجوی مطلبی در فوروم‌های 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 اما صفحه ارور ۴۰۳ میده. آیا سند معتبری هم هست برای ارایه به افراد ثالث؟
    • #
      ‫۹ ماه قبل، دوشنبه ۶ آذر ۱۴۰۲، ساعت ۱۷:۰۴
      لینک همین مطلب رو بفرستید.