PDA

View Full Version : اشکال هنگام استفاده ازIE7



SabaSabouhi
چهارشنبه 10 آبان 1385, 17:39 عصر
با سلام
با استفاده از APS.Net (نسخه 2003) سایتى ساخته‌ام. برخى از پیکربندى‌هاى مربوط به کاربران در رویداد Session_Start انجام مى‌شود. هنگام استفاده از IE7 اگر یک TAB جدید ایجاد کنیم و در آن TAB مجدداً به همین سایت وصل شویم، از نظر برنامه یک Session جدید ایجاد نمى‌شود و براى این TAB جدید از همان Session سابق استفاده مى‌کند که باعث مشکلاتى در استفاده از سیستم مى‌شود.

اگر دلیل بروز این مشکل و یا راه حلى براى آن مى‌دانید، خواهشمندم مرا راهنمایى کنید.

صبا صبوحى

Behrouz_Rad
چهارشنبه 10 آبان 1385, 18:22 عصر
Session در صورتی از بین میره که یا پنجره ی مرورگر بسته بشه و یا زمان حیات Session به پایان برسه!
بدیهی است که با ایجاد یک Tab جدید، هیچکدام از موارد فوق رخ نخواهد داد.
در مورد مشکلاتی که در سیستمت به وجود میاد و تلاش برای رفع اون، باید از کاری که قصد انجامش رو داری مطلع شد.

موفق باشید.

pegasos
چهارشنبه 10 آبان 1385, 18:45 عصر
با درود.


Session در صورتی از بین میره که یا پنجره ی مرورگر بسته بشه
یا شاید بهتره بگوییم
Session در صورتی از دست شما خارج می شود که پنجره ی مرورگر بسته شود.

ولی در مورد مورد مشکل شما :
احتمالا شما در مرورگر های قدیمی تر از IE7 چنانچه با فرمان Ctrl + N یک پنجره جدید باز کنی به همین مشکل بر خواهی خورد.

برای اینکه این پنجره جدید تمام خصلت های پنجره قدیمی را به ارث می برد[به صورت خیلی ساده شناسه Session را یک Cookie داخلی Browser فرض کنید].
برای اینکه این مشکل را در IE7 حل کنی باید باید یک Instance جدید از IE اجرا کنی.

ولی همانطور که جناب Behrouz_Radهم اشاره کردن باید مسئله ات را بیشتر توضیح بدهی.

به نظر من خیلی غیر منطقی است که یک کاربر بروی یک کامپیوتر چنیدین Session بروی Web Application داشته باشد.

به امید موفقیت.

SabaSabouhi
پنج شنبه 11 آبان 1385, 16:37 عصر
با درود.
Session در صورتی از دست شما خارج می شود که پنجره ی مرورگر بسته شود.

ولی در مورد مورد مشکل شما :
احتمالا شما در مرورگر های قدیمی تر از IE7 چنانچه با فرمان Ctrl + N یک پنجره جدید باز کنی به همین مشکل بر خواهی خورد.

برای اینکه این مشکل را در IE7 حل کنی باید باید یک Instance جدید از IE اجرا کنی.

به نظر من خیلی غیر منطقی است که یک کاربر بروی یک کامپیوتر چنیدین Session بروی Web Application داشته باشد.

به امید موفقیت.

با سلام
نسخه از پاسخ‌گویى شما و آقاى راد سپاسگزارم.
بله کاملاً درست حدس زدید هنگام استفاده از Ctrl-N هم همین مشکل در IE 6.0 ایجاد مى‌شود. و این را نیز مى‌دانم که با اجراى یک Instance جدید مشکل حل مى‌شود. اما توجیه کاربران در این حالت کمى سخت هست. بخصوص در مورد IE 7.0 که داشتن چند TAB خیلى استفاده را راحت کرده.

در مورد منطقى نبودن وجود چند Session با شما موافق نیستم. اگر کاربر من بخواهد دو یا چند Instance از IE (یا چند TAB در IE 7.0) را همزمان باز کند چه اشکالى دارد؟ در این صورت برنامه‌ى من باید براى هر کدام از این Instanceها یا Tabها اطلاعات و وضعیت را به صورت جداگانه نگهدارى کند. حال اگر Session یکى باشد هنگام استفاده تداخل پیش مى‌آید.

بگذارید پرسش را به شکل دیگرى مطرح کنم.
آیا مى‌توان در IE 7.0 یک Tab جدید باز کرد و به همان سایت متصل شد به شکلى که براى آن Tab یک Session جدید ایجاد شود و مانند Ctrl-N تلقى نشود؟

و یا این که آیا مى‌توان پس از اجراى یک Instance جدید از IE در برنامه آن را تشخیص داد؟ و هنگام پاسخ دادن به یک Request بدانیم که مربوط به کدام‌یک از Instance ها بود؟

با سپاس
صبا صبوحى

Behrouz_Rad
پنج شنبه 11 آبان 1385, 17:28 عصر
برای اینکه این مشکل را در IE7 حل کنی باید باید یک Instance جدید از IE اجرا کنی.


این را نیز می‌دانم که با اجرای یک Instance جدید مشکل حل می‌شود.

البته بنده که IE 7.0 ندارم! اما تا IE 6.0 SP2 اطلاع دارم که باز کردن نمونه ی جدید از IE مشکل رو حل نمی کنه! البته ربطی به مروگر و نسخه ی اون نداره چون شناسه ی Session یک کوکی هست و این کوکی از نوع Durable هست و تا زمان گردش در سایت باقی می مونه.

به نظر من خیلی غیر منطقی است که یک کاربر بروی یک کامپیوتر چندین Session بروی Web Application داشته باشد.
دقیقا نه! اما باید تا حد ممکن از ایجاد Session اجتناب بشه.

سرکار خانم همچنان در مورد کاری که قصد انجامش رو داری مخفی کاری می کنی!

موفق باشید

pegasos
شنبه 13 آبان 1385, 08:41 صبح
با درود.


اگر کاربر من بخواهد دو یا چند Instance از IE (یا چند TAB در IE 7.0) را همزمان باز کند چه اشکالى دارد؟

هیچ اشکالی ندارد و خیلی هم کارا خواهد بود که شما در برنامه چندین صفحه ی مجزا از هم داشته باشید.


در این صورت برنامه‌ى من باید براى هر کدام از این Instanceها یا Tabها اطلاعات و وضعیت را به صورت جداگانه نگهدارى کند. حال اگر Session یکى باشد هنگام استفاده تداخل پیش مى‌آید.

دقیقا به همان مسئله ای اشاره کردید که فکر می کردم. :اشتباه:
دوست گرامی یعنی شما می خواهید برای هر تب جدید یک thread جدا گانه به یک کاربر بدهید.


خوب من با این قضیه مشکل دارم.
من نمی فهم که چرا اگر Session یکی باشد تداخل پیش می آید.
تمامی زیبایی معماری شما به این است که بتوانید اطلاعات یک کاربر را در جاهای مختلف مدیریت کنید.

فرض کنید ما وارد سایت ماکروسافت می شویم، Sign in می کنیم.
خوب حالا هزار تا پنجره هم باز کنید و در جاهای مختلف کارهای متفاوتی انجام دهید، به هیچ وجه برای شما Session جداگانه ساخته نمی شود.

حتی در بعضی از معماری ها شما چنانچه با یک نام کاربری در خواست thread جدید کنید ،thread قبلی شما را باطل می کنند.
بله ،بعضی جاها این کار منطقی است مثلا در debugging و ...


سرکار خانم همچنان در مورد کاری که قصد انجامش رو داری مخفی کاری می کنی!


:متفکر: :متفکر:

SabaSabouhi
شنبه 13 آبان 1385, 11:48 صبح
با درود.
دقیقا به همان مسئله ای اشاره کردید که فکر می کردم. :اشتباه:
دوست گرامی یعنی شما می خواهید برای هر تب جدید یک thread جدا گانه به یک کاربر بدهید.

با سلام
بله دقیقاً همین کار را می‌خواهم انجام دهم.


خوب من با این قضیه مشکل دارم.
من نمی فهم که چرا اگر Session یکی باشد تداخل پیش می آید.
تمامی زیبایی معماری شما به این است که بتوانید اطلاعات یک کاربر را در جاهای مختلف مدیریت کنید.

ببینید من موقعیت کاربر را در صفحه‌ی مورد نظر و تمام تنظیمات وی را در Session ذخیره می‌کنم. حال اگر دو TAB با یک Session داشته باشیم این اطلاعات برای هر دو Tab در نظر گرفته می‌شود. حال تصور کنید که کاربر ما در یکی از Tabها Logoff کرده و بخواهد با یک UserID دیگر به سایت Logon کند. پس از این اتفاق به Tab قبل برگردد و بخواهد کاری انجام دهد.


فرض کنید ما وارد سایت ماکروسافت می شویم، Sign in می کنیم.
خوب حالا هزار تا پنجره هم باز کنید و در جاهای مختلف کارهای متفاوتی انجام دهید، به هیچ وجه برای شما Session جداگانه ساخته نمی شود.

حتی در بعضی از معماری ها شما چنانچه با یک نام کاربری در خواست thread جدید کنید ،thread قبلی شما را باطل می کنند.
بله ،بعضی جاها این کار منطقی است مثلا در debugging و ...

با توجه به مشکلی که من دارم چه راه حلی وجود دارد؟ آیا درخواست Thread مشکل من را حل می‌کند؟ و چگونه با باز شدن یک Tab جدید باید درخواست Thread کرد در حالی که با باز شدن این Tab جدید هیچ رویدادی فراخوانی نمی‌شود؟


البته بنده که IE 7.0 ندارم! اما تا IE 6.0 SP2 اطلاع دارم که باز کردن نمونه ی جدید از IE مشکل رو حل نمی کنه! البته ربطی به مروگر و نسخه ی اون نداره چون شناسه ی Session یک کوکی هست و این کوکی از نوع Durable هست و تا زمان گردش در سایت باقی می مونه.


اما بر خلاف نظر آقای راد دقیقاً عمل‌کرد تفاوت داره، هنگامی که با Ctrl-N پنجره‌ی جدید باز کنیم مشکل وجود داره اما اگر یک Instance جدید رو اجرا کنیم و به سایت متصل بشیم این مشکل به وجود نمی‌آد.

با سپاس
صبا صبوحی

pegasos
شنبه 13 آبان 1385, 13:32 عصر
با درود.

در تاریخ ، بیش از نیمی از سعالهایی که بی پاسخ مانده اند مشکلشان از مطرح کردن بد صورت مسئله بوده است.

با اینکه شخصا علاقه مندم این گفتمان به فرجام خوبی بی انجامد، ولی تا وقتی که پاسخ جمله ی زیر داده نشود ،من از پست زدن در این تاپیک خودداری می کنم.


سرکار خانم همچنان در مورد کاری که قصد انجامش رو داری مخفی کاری می کنی!

SoheilKH
شنبه 13 آبان 1385, 22:02 عصر
تصور کنید که کاربر ما در یکی از Tabها Logoff کرده و بخواهد با یک UserID دیگر به سایت Logon کند. پس از این اتفاق به Tab قبل برگردد و بخواهد کاری انجام دهد.
صبا صبوحی
اگر مشکلت اینه
بهتره برای Security و مدیریت کاربران سایت ات از iis (وب سرور) کمک بگیری نه از session ها
توی فایل وب کانفیگ سایت اتAuthentication را مشخص کن
فایل ها و فولدر های برنامه ات که احتیاج به Security و دسترسی کاربر valid را دارند را نیز تعیین کن.( Authorizing)

برای Sign In/Out هم از روال ها مربوطه استفاده کن.

مطمئن باش بعد از Sign Out کردن در هر Tab اجرای درخواست دیگر در Tab های دیگر وجود ندارد (مگر با مراجعه به صفحه Login.)بهتر بگم IIS اجازه دسترسی به فایل های مربوطه را نمی دهد.
حالا اگر هم Login کنه در tab های دیگر به عنوان کاربری که در Tab فعلی Login کرده شناخته می شه

توی یاهو هم اگر دقت کنی می بینی که وقتی یکبار login کردی و وارد صفحه میل بشی، هر چند تا میل توی tab های جدید باز کنی ، هیچ مشکلی پیش نمی آید .اما وقتی توی یکی از Tab ها Sign Out کنی .توی tab های دیگه هر کاری کنی (دیدن میل مثلا) به صفحه Login هدایت میشوی

موفق باشی

SabaSabouhi
دوشنبه 15 آبان 1385, 13:42 عصر
با درود.

در تاریخ ، بیش از نیمی از سعالهایی که بی پاسخ مانده اند مشکلشان از مطرح کردن بد صورت مسئله بوده است.

با اینکه شخصا علاقه مندم این گفتمان به فرجام خوبی بی انجامد، ولی تا وقتی که پاسخ جمله ی زیر داده نشود ،من از پست زدن در این تاپیک خودداری می کنم.

با سلام
شما دنبال چه پاسخى هستید؟ مشکل من ربطى به اطلاعات مندرج در سایت نداره که شما از لفظ مخفى‌کارى استفاده مى‌کنید.
دوست عزیز، من مشکلى در زمینه‌ى Sessionها دارم که احتمالاً یا به دلیل درک اشتباه من از برخى مفاهیم هست و یا این که اصلاً راه حلى براى قضیه وجود نداره. اما باز اگر ارائه اطلاعاتى مربوط به سایت به شما در حل این مشکل کمک مى‌کند بگویید تا توضیح بدهم.

حتا اگر به پست زدن هم ادامه ندهید، من تا همین حد هم از همراهى و همفکرى شما سپاسگزارم.

صبا صبوحى

SabaSabouhi
دوشنبه 15 آبان 1385, 13:56 عصر
مطمئن باش بعد از Sign Out کردن در هر Tab اجرای درخواست دیگر در Tab های دیگر وجود ندارد (مگر با مراجعه به صفحه Login.)بهتر بگم IIS اجازه دسترسی به فایل های مربوطه را نمی دهد.
حالا اگر هم Login کنه در tab های دیگر به عنوان کاربری که در Tab فعلی Login کرده شناخته می شه

موفق باشی

با سلام
دوست عزیز، همین الان هم همین اتفاق مى‌افته و من دقیقاً مى‌خواهم برعکس این اتفاق رو ببینم. یعنى مثلاً در یک Tab با شناسه‌‌ى SabaSabouhi کار کنم و در یک Tab دیگه با شناسه‌ى SoheilKH. براى این که واضح‌تر باشه در یک Tab مى‌خواهم با شناسه‌ى Admin وارد بشم و در Tab دیگه با شناسه‌ى یک کاربر دیگه تا بتونم نتیجه‌ى یک تغییر در تنظیمات رو به صورت Online ببینم بدون این که هر بار نیاز به Logoff و Logon مجدد داشته باشم.
در حال حاضر وقتى دو Instance جداگانه باز مى‌کنم به راحتى این کار انجام مى‌شه ولى وقتى که در IE 6.0 از Ctrl-N استفاده کنم و یا در IE 7.0 یک Tab جدید ایجاد کنم این کار انجام نمى‌شه و همین اتفاقى مى‌افته که شما هم توضیح دادید. البته با این فرق که دیگه نیازى به Logon هم نداره.

صباصبوحى

pegasos
دوشنبه 15 آبان 1385, 15:36 عصر
با درود.

چیزی که من از صحبت های شما دستگیرم می شود این است که : شما بوسیله یک کاربر می خواهید به صفحات مختلفی دسترسی داشته باشید که اطلاعات همان کاربر در این صفحه متفاوت با یکدیگر می باشند، و حتما هم می خواهید این اطلاعات را در Session کاربر ذخیره کنید.

پیشنهادی که من می کنم،
اگر فرض کنم که اطلاعات تمامی صفحات شما متغیر می باشند، حداقل می توانید برای اطلاعات هر صفحه ای یک کلاس مجزا درست کنید که اطلاعات آن صفحه خاص را نگهداری کند..

حالا می توانید یک کلاس مدیریت اطلاعات کاربران درست کنید که وظیفه ی این کلاس نگهداری آن کلاسهای کوچک می باشد.
و احتمالا این کلاس در Session ذخیره می شود.
خوب حالا برای هر کاربر در هر صفحه ای می توانید اطلاعات مجزایی را برگردانید.

این تمام چیزی بود که از صحبتهای شما دستگیرم شد .
اگر راه حلی که من ارائه دادم فکر می کنید درست است ، دو نوع از اطلاعاتی را که می خواهید در صفحه های مجزا برای یک کاربر ذخیره شود ، به من بدهید تا به صورت بهینه آن را پیاده سازی کنم.

به امید موفقیت.

SabaSabouhi
سه شنبه 16 آبان 1385, 11:05 صبح
با درود.
این تمام چیزی بود که از صحبتهای شما دستگیرم شد .
اگر راه حلی که من ارائه دادم فکر می کنید درست است ، دو نوع از اطلاعاتی را که می خواهید در صفحه های مجزا برای یک کاربر ذخیره شود ، به من بدهید تا به صورت بهینه آن را پیاده سازی کنم.
به امید موفقیت.
با سلام
این سایت شامل بخش‌هایى براى ورود اطلاعات، مشاهده‌ى اطلاعات، اصلاح اطلاعات و گزارش‌گیرى هست. کنترل کاربران و دسترسى‌ها توسط Admin انجام مى‌شود. مثال مشخصى که مى‌توانم براى شما بگویم این است که یک نفر با دو شناسه مى‌خواهد همزمان کار کند یعنى ابتدا با شناسه‌ى Admin دسترسى یک گزارش را به مثلاً شناسه‌ى User1 بدهد یا بگیرد، و سپس با User1 وارد سیستم شود و نتیجه‌ى آن تغییر دسترسى را مشاهده کند. اگر من که هم با شناسه‌ى Admin و هم با شناسه‌ىUser1 وارد سیستم مى‌شوم بخواهم از یک Instance از IE استفاده کنم مجبورم مرتب Logoff و Logon کنم. بجاى آن دو Instance از IE اجرا مى‌کنم در یکى از آنها با Admin Logon مى‌کنم و در دیگرى با User1 و با هر تغییر دسترسى در IE اول به IE دوم رفته و با یک F5 نتیجه را مشاهده مى‌کنم. اما اگر IE دوم با Ctrl-N ایجاد شده باشد این امر امکان پذیر نیست چون کاربر هر دو Admin خواهد بود. در برنامه من اطلاعات مربوط به کلیدها و دسترسى‌هاى هر کاربر را در Session ذخیره مى‌کنم و این کلاس را هنگام ایجاد Session در رویداد SessionStart ایجاد کرده و ذخیره مى‌کنم.
هنگامى که یک Instance جدید ایجاد مى‌کنم این رویداد فراخوانى مى‌شود ولى وقتى به Ctrl-N یک IE جدید باز مى‌شود این رویداد فراخوانى نمى‌شود و در برنامه اصلاً نمى‌توانم متوجه باز شدن یک IE جدید باشم. همین مشکل هنگام ایجاد یک Tab جدید در IE 7.0 هم وجود دارد.

اگر کمکى کند یک مثال دیگر هم بزنم. در سایت صفحه‌اى دارم که Log برنامه را ببینم. مى‌خواهم انجام یک کار را مرحله به مرحله کنترل کنم. در IE اول به صفحه‌ى مورد نظر مى‌روم و کار را آغاز مى‌کنم و در IE دوم به صفحه مشاهده Log مى‌روم. با انجام هر عمل در صفحه‌ى اول با یک کلید F5 نتیجه را در صفحه دوم مشاهده مى‌کنم.
حالا اگر IE دوم را با Ctrl-N باز کنم با زدن F5 بجاى آن که صفحه Log را Refresh شده ببینم همان صفحه‌ى اول را خواهم دید. (اطلاعات مربوط به صفحه‌اى که کاربر در آن هست نیز در Session نگهدارى مى‌شود)

با سپاس
صبا صبوحى

pegasos
سه شنبه 16 آبان 1385, 15:22 عصر
با درود.

ممنون از اطلاعات کاملی که ارائه نمودید.


بله ،بعضی جاها این کار منطقی است مثلا در debugging و ...


من از صحبت های شما دقیقا این مسئله به ذهنم می رسد. که شما دارید برنامه را Debug و یا ،Trace می کنید.

خوب در این صورت هر کاری مجاز به نظر می رسد.
ولی در غیر این صورت باید یک فکری به حالش کرد.

به امید موفقیت.