WorldVbMan
پنج شنبه 27 فروردین 1388, 13:38 عصر
با سلام خدمت اساتید
اصل مطلب:
حذف فولدر یا كپی اون یا حتی تغییر اسمش و بطور كلی هر عملی روی فولدرها منجر میشه كه AppDomain ریست بشه و نتیجتاً Session ها هم از بین برند و یك جلسه ی كاری جدید یا همون Session جدید ایجاد شه
این رو كه مسلمه همتون میدونید و مشكلاتی كه می تونه پدید بیاره مشخصه
سؤال چرا تو همین فروم نگشتی؟
پاسخ:كل اینترنت رو زیر و رو كردم نه فقط این فروم رو
خب ، نتیجه چی شد؟
راه حل هایی كه كلاً پیدا كردم از این قرارند، همشون رو می نویسم تا یه مرجع كامل بشن!
1- خیلی از سایت ها پیشنهاد دادند كه از نوع In-proc برای Session استفاده نكنم كه این برای كار من معقول نیست چون ترجیحاً رم باید استفاده شه نه هارد كه از نظر سرعت توجیهش مشخصه و توضیح نمیخواد
2- در همین فروم ها استاد گرامیمون در این تاپیك گفتند كه نصب این Hotfix منجر میشه كه مشكل مذكور حل شه:
http://www.barnamenevis.org/forum/showthread.php?t=65815
واقعاً متشكرم چون سایت های دیگه ای هم همین پیشنهاد رو دادند ولی مشكل این راه حل چیه؟
اگه شركت خدمات هاست اعتماد نكنه یا با هر بهانه ای از نصبش امتناع كنه یا در دسترس نیست چه باید كرد؟
فرض كه این مشكل به خودم مربوطه! در این تاپیك از همین فروم یه مطلبیه كه اگه درست فهمیده باشمش میگه امكان میره كه بعد از نصب وصله ی فوق یه مشكل دیگه در مورد ایجاد فولدرهای هم اسم پیش بیاد كه توضیحش در دسترسه :
http://barnamenevis.org/forum/archive/index.php/t-66670.html
خب اگه این مشكل وجود داره كه راه حل منتفیه اگر نه هم كه Ok شده
3- در خیلی فروم های غیر ایرانی پیشنهاد شده كه فولدرها در فولدری غیر از فولدر اصلی Application باشند تا حذف و غیره میسر باشه و ریست رخ نده
مشكل: چطور دات نت می تونه آدرسی رو مورد تغییر قرار بده كه در حوزه ی خودش نیست یا در حوزه ی اون سایت نیست فكر می كنم Permission این كار در اختیار كد نباشه
بعد هم یك پروژه ی 25000 خط كدی كه كلی فولدر داره رو فكر می كنم شما هم اذعان دارید كه براحتی نمیشه تغییر آدرس داد چون كدهای بسیاری پنهون می مونند كه كار پروژه رو مختل می كنند
پس این هم ظاهراً كنسل
4- Junction و چه میدونم فولدر چی چی اسمشو بذاریم كه خلاصه از نظر سرویس Internet Information Services (iis) جزء App در نظر گرفته نشه كه این راه حل هم ظاهراً ابزارش برای windows server 2003 هست نه 2008 و بعد هم مشكلاتی كه در مورد اول بحث شد راجع باینكه سرور و هاست در دسترس نیست هنوز پابرجاست
http://blogs.msdn.com/toddca/archive/2005/12/01/499144.aspx
5- افزودن كد خاموش كردن مانیتورینگ فولدرها یا همون FCN در این روش در فایل global.asax و در متد Application_start كد ذیل رو اضاف می كنیم تا مانیتورینگ كنسل شه
این پیشنهاد رو در سایت مایكروسافت هم دیدم و در كلی سایت دیگه البته اون یكی راه حل ها هم فراوون در دسترس بودند
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
StopMonitorFolderChange()
End Sub
Private Sub StopMonitorFolderChange()
Dim p As System.Reflection.PropertyInfo = GetType(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", _
System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.[Public] Or System.Reflection.BindingFlags.[Static])
Dim o As Object = p.GetValue(Nothing, Nothing)
Dim f As System.Reflection.FieldInfo = o.[GetType]().GetField("_dirMonSubdirs", _
System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.IgnoreCase)
Dim monitor As Object = f.GetValue(o)
Dim m As System.Reflection.MethodInfo = monitor.[GetType]().GetMethod("StopMonitoring", _
System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic)
m.Invoke(monitor, New Object() {})
End Sub
همانند این وبلاگ كه كد عیناً از اون برداشته شده :
http://fuchangmiao.blogspot.com/2008/12/deleting-subdirectory-restarts.html
یا این یكی
http://dotnetslackers.com/Community/blogs/haissam/archive/2008/11/12/disable-session-expiration-when-using-directory-delete.aspx
مشكل چیه؟ هیچ تغییری رخ نداد و بعد از حذف فولدر از Session هام خبری نبود
6-افزودن دو خصیصه ی waitChangeNotification و maxwaitChangeNotification در فایل Web.config بدین شرح:
<httpRuntime waitChangeNotification="?" maxWaitChangeNotification="?"/>
آدرس سایت ها اونقدر زیاد بود كه بدبخت اپرا شاكی شده بود و متأسفانه یه سریشون رو نشد بذارم
این بار در یكی از صفحات كه فقط یك فولدر رو حذف و كپی می كرد نتیجه درست بود و Session همچنان باقی بود كه البته در رفرش های متوالی اون هم درست عمل نمی كرد ولی در كنترلی كه چند فولدر حذف میشدند آناً Session حذف میشد
البته شاید مقادیری كه باید در هر خصیصه بیاد رو بد گذاشتم ولی این كار رو با مقادیر كم و
زیاد تست كردم و تغییری ندیدم
در سایت مایكروسافت یه سرچ بزنید waitChangeNotification فكر می كنم توضیحشو بیاره كه یه Delay در ریست میده و از این جور كارها
http://msdn.microsoft.com/en-us/library/e1f13641.aspx
خلاصه ما موندیم و این مشكل و یه فرصت خیلی كم و برای رفعش دو روز سرچ كه جوابی نداد، شما راهنمایی ای ندارید كه از تجربتون بصورت عملی ناشی شده باشه؟
متشكرم
اصل مطلب:
حذف فولدر یا كپی اون یا حتی تغییر اسمش و بطور كلی هر عملی روی فولدرها منجر میشه كه AppDomain ریست بشه و نتیجتاً Session ها هم از بین برند و یك جلسه ی كاری جدید یا همون Session جدید ایجاد شه
این رو كه مسلمه همتون میدونید و مشكلاتی كه می تونه پدید بیاره مشخصه
سؤال چرا تو همین فروم نگشتی؟
پاسخ:كل اینترنت رو زیر و رو كردم نه فقط این فروم رو
خب ، نتیجه چی شد؟
راه حل هایی كه كلاً پیدا كردم از این قرارند، همشون رو می نویسم تا یه مرجع كامل بشن!
1- خیلی از سایت ها پیشنهاد دادند كه از نوع In-proc برای Session استفاده نكنم كه این برای كار من معقول نیست چون ترجیحاً رم باید استفاده شه نه هارد كه از نظر سرعت توجیهش مشخصه و توضیح نمیخواد
2- در همین فروم ها استاد گرامیمون در این تاپیك گفتند كه نصب این Hotfix منجر میشه كه مشكل مذكور حل شه:
http://www.barnamenevis.org/forum/showthread.php?t=65815
واقعاً متشكرم چون سایت های دیگه ای هم همین پیشنهاد رو دادند ولی مشكل این راه حل چیه؟
اگه شركت خدمات هاست اعتماد نكنه یا با هر بهانه ای از نصبش امتناع كنه یا در دسترس نیست چه باید كرد؟
فرض كه این مشكل به خودم مربوطه! در این تاپیك از همین فروم یه مطلبیه كه اگه درست فهمیده باشمش میگه امكان میره كه بعد از نصب وصله ی فوق یه مشكل دیگه در مورد ایجاد فولدرهای هم اسم پیش بیاد كه توضیحش در دسترسه :
http://barnamenevis.org/forum/archive/index.php/t-66670.html
خب اگه این مشكل وجود داره كه راه حل منتفیه اگر نه هم كه Ok شده
3- در خیلی فروم های غیر ایرانی پیشنهاد شده كه فولدرها در فولدری غیر از فولدر اصلی Application باشند تا حذف و غیره میسر باشه و ریست رخ نده
مشكل: چطور دات نت می تونه آدرسی رو مورد تغییر قرار بده كه در حوزه ی خودش نیست یا در حوزه ی اون سایت نیست فكر می كنم Permission این كار در اختیار كد نباشه
بعد هم یك پروژه ی 25000 خط كدی كه كلی فولدر داره رو فكر می كنم شما هم اذعان دارید كه براحتی نمیشه تغییر آدرس داد چون كدهای بسیاری پنهون می مونند كه كار پروژه رو مختل می كنند
پس این هم ظاهراً كنسل
4- Junction و چه میدونم فولدر چی چی اسمشو بذاریم كه خلاصه از نظر سرویس Internet Information Services (iis) جزء App در نظر گرفته نشه كه این راه حل هم ظاهراً ابزارش برای windows server 2003 هست نه 2008 و بعد هم مشكلاتی كه در مورد اول بحث شد راجع باینكه سرور و هاست در دسترس نیست هنوز پابرجاست
http://blogs.msdn.com/toddca/archive/2005/12/01/499144.aspx
5- افزودن كد خاموش كردن مانیتورینگ فولدرها یا همون FCN در این روش در فایل global.asax و در متد Application_start كد ذیل رو اضاف می كنیم تا مانیتورینگ كنسل شه
این پیشنهاد رو در سایت مایكروسافت هم دیدم و در كلی سایت دیگه البته اون یكی راه حل ها هم فراوون در دسترس بودند
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
StopMonitorFolderChange()
End Sub
Private Sub StopMonitorFolderChange()
Dim p As System.Reflection.PropertyInfo = GetType(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", _
System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.[Public] Or System.Reflection.BindingFlags.[Static])
Dim o As Object = p.GetValue(Nothing, Nothing)
Dim f As System.Reflection.FieldInfo = o.[GetType]().GetField("_dirMonSubdirs", _
System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.IgnoreCase)
Dim monitor As Object = f.GetValue(o)
Dim m As System.Reflection.MethodInfo = monitor.[GetType]().GetMethod("StopMonitoring", _
System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic)
m.Invoke(monitor, New Object() {})
End Sub
همانند این وبلاگ كه كد عیناً از اون برداشته شده :
http://fuchangmiao.blogspot.com/2008/12/deleting-subdirectory-restarts.html
یا این یكی
http://dotnetslackers.com/Community/blogs/haissam/archive/2008/11/12/disable-session-expiration-when-using-directory-delete.aspx
مشكل چیه؟ هیچ تغییری رخ نداد و بعد از حذف فولدر از Session هام خبری نبود
6-افزودن دو خصیصه ی waitChangeNotification و maxwaitChangeNotification در فایل Web.config بدین شرح:
<httpRuntime waitChangeNotification="?" maxWaitChangeNotification="?"/>
آدرس سایت ها اونقدر زیاد بود كه بدبخت اپرا شاكی شده بود و متأسفانه یه سریشون رو نشد بذارم
این بار در یكی از صفحات كه فقط یك فولدر رو حذف و كپی می كرد نتیجه درست بود و Session همچنان باقی بود كه البته در رفرش های متوالی اون هم درست عمل نمی كرد ولی در كنترلی كه چند فولدر حذف میشدند آناً Session حذف میشد
البته شاید مقادیری كه باید در هر خصیصه بیاد رو بد گذاشتم ولی این كار رو با مقادیر كم و
زیاد تست كردم و تغییری ندیدم
در سایت مایكروسافت یه سرچ بزنید waitChangeNotification فكر می كنم توضیحشو بیاره كه یه Delay در ریست میده و از این جور كارها
http://msdn.microsoft.com/en-us/library/e1f13641.aspx
خلاصه ما موندیم و این مشكل و یه فرصت خیلی كم و برای رفعش دو روز سرچ كه جوابی نداد، شما راهنمایی ای ندارید كه از تجربتون بصورت عملی ناشی شده باشه؟
متشكرم