PDA

View Full Version : استفاده از session



آرام جان گل
سه شنبه 05 آبان 1388, 09:21 صبح
سلام
من در زمان استفاده از session متغییر هایم گاهی گم می شود و در ضمن موقع debug کردن متغییر های من را نمی شناسد انگار که گم می شود و می پره

حالا از چی استفاده کنم لطفاً کد نمونه بگذارید
می تونم از viewState استفاده کنم؟
لطفا نمونه کد

مرسی راهنمایی کنید

آریوس1985
سه شنبه 05 آبان 1388, 10:33 صبح
سلام
یعنی چی که متغیر هام گم میشن؟
احتمالا ایراد از کد شماست که این اتفاق میافته.
بله.شدنش که میشه استفاده کرد اما این کار باعث بار اضافی توی تمام صفحاتتون میشه. پیشنهاد میکنم مشکل رو پیدا کنید و از همون Session استفاده کنید

Alireza Orumand
سه شنبه 05 آبان 1388, 15:11 عصر
سلام
منظورتون از گم شدن چیه؟ میشه بیشتر توضیح بدید! اگر منظورتون اینه که Sessionخالی میشه که خوب این خیلی طبیعیه و خاصیت Session اینه که در زمان مشخصی expireمیشه و داده های اون از بین میره.
اما اگه منظورتون اینه که نمیتونید session رو پیدا کنید من پیشنهاد میکنم که از propertiyاستفاده کنید. به خاطر اینکه برای کار با سشن یه keyنیاز دارید و اون key یک stringهست ممکنه شما در جاهای مختلفی که از اون sessionمیخاید استفاده کنید اشتباه تایپی داشته باشید و Sessionصحیح رو پیدا نکنید. دقیقا به همین دلیل من موقع کار با Sessionهمیشه از propertyاستفاده میکنم. مثلا فرض کنید که نام فرد رو میخاید در Session نگه داری کنید که به شکل زیر میشه


protected string Name
{
get
{
if (Session["Name"] != null)
{
return Session["Name"].ToString();
}
else
{
return string.Empty;
}
}

set
{
Session["Name"] = value;
}
}

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


می تونم از viewState استفاده کنم؟

خیر. این دو تا شی از پایه و اساس با هم متفاوت هستن. یکی در سمت سرور و دیگری در سمت کلاینت نگه داری میشه. اما مسئله اصلی اینه که viewstate در سطح صفحه مفهوم داره و سشن در سطح application
موفق باشید.

آرام جان گل
چهارشنبه 06 آبان 1388, 07:55 صبح
سلام

کاربر Alireza Orumand شما که این قدر خوب توضیح دادید لطفاً بگید چه موقع خوبه از session و چه موقع خوبه از View State استفاده کرد؟

آرام جان گل
چهارشنبه 06 آبان 1388, 09:55 صبح
سلام

ببینید من کدم را می گذارم

در صفحه Login بعد از کلیک روی دکمه Login می نویسم:


Session["UserID"] = dal.GetUserLoggedID(LowerUserName, HashedPass).ToString();


و در Load صفحاتم می نویسم :


this.Session.Timeout = 360;
GlobalObj.AccessInForms(Session["UserID"].ToString(), "TabForm", this.form1);

گاهی به این خط کد


GlobalObj.AccessInForms(Session["UserID"].ToString(), "TabForm", this.form1);

و این پیغام را می ده
Obgect refrence not set to an instance an object

فکر می کنید ایراد از چیه؟
ایراد می گیره

Alireza Orumand
چهارشنبه 06 آبان 1388, 09:58 صبح
سلام
با کمی دقت به حیطه این دوتا شی میشه بهترین محل استفاده از اونها رو پیدا کرد.
viewstate توی صفحه ذخیره میشه و به سمت کاربر ارسال میشه و بر میگرده، پس نتیجه اینکه جایی که داده بزرگ هست استفاده از این گزینه چندان مناسب نیست. در ضمن این گزینه فقط در صفحه جاری وجود داره و نتیجه اینکه اگر بخاید از متغیری توی دو صفحه جدا گونه استفاده کنید باز هم این گزینه مناسب نیست.
بهترین جای استفاده از viewstate ذخیره کردن متغیر های کوچیکیه که داخل همین صفحه فقط به اون نیاز داریم.
در مقابل session در کل application در دسترس هست و شما میتونید متغیری که در این شی ذخیره میکنید در هر جایی از برنامه مورد استفاده قرار بدید. در کل پیشنهاد میشه برای داده های خیلی بزرگ هم از این گزینه استفاده نکنید.

برای نگهداری و انتقال اطلاعات در ASP.NET راه های مختلفی از جمله session و Viewstatie وجود داره، که توی یه مقاله همه اونها رو توضیح دادم و مزایا و معایب هر کدوم رو مورد بررسی قرار دادم که میتونید مقاله رو اینجا (http://barnamenevis.org/forum/showthread.php?t=168113)مشاهده کنید.

روشی که شما برای مدیریت کاربران استفاده میکنید رو پیشنهاد نمیکنم. میتونید از امکانات خود asp.net استفاده کنید ولی در کل میتونید کد رو به شکل زیر اصلاح کنید تا مشکل برطرف بشه.



if (Session["UserID"]!= null && !string.IsNullOrEmpty(Session["UserID"].ToString()))
{
GlobalObj.AccessInForms(Session["UserID"].ToString(), "TabForm", this.form1);
}

موفق باشید.

iman_ad
چهارشنبه 06 آبان 1388, 10:24 صبح
شاید از کست باشه، نوع داده ای که از session می خونی مشخص کن

(string)Session["UserID"].ToString()

آرام جان گل
چهارشنبه 06 آبان 1388, 13:52 عصر
چرا من وقتی کد کاربر Alireza Orumand را می نویسم Session را نمی شناسه؟

آرام جان گل
چهارشنبه 06 آبان 1388, 14:10 عصر
امکانات خود asp.net را برای مدیریت کاربران نمی دونم و نمی شناسم میشه توضیح بدید؟ آیا امنیتش بالاست؟

mehdi.mousavi
چهارشنبه 06 آبان 1388, 15:55 عصر
protected string Name
{
get
{
if (Session["Name"] != null)
{
return Session["Name"].ToString();
}
else
{
return string.Empty;
}
}

set
{
Session["Name"] = value;
}
}


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


protected string Name
{
get { return (string)(Session["Name"] ?? string.Empty); }
set { Session["Name"] = value; }
}


سپاسگذارم.

Alireza Orumand
چهارشنبه 06 آبان 1388, 17:31 عصر
سلام


چرا من وقتی کد کاربر Alireza Orumand را می نویسم Session را نمی شناسه؟

کجا از کد من استفاده میکنید که نمیشناسه؟


امکانات خود ASP.NET را برای مدیریت کاربران نمی دونم و نمی شناسم میشه توضیح بدید؟ آیا امنیتش بالاست؟

توضیح دادن این امکانات تو یک تاپیک امکان پذیر نیست ولی در کل asp.net یک سری api و جداول در دیتابیس داره که میتونید برای امنیت سایت از اونها استفاده میکند. که در System.Web.Security کلاس های membership و ... وجود داره.


جسارتا میتونم پیشنهاد کنم جای کد ناخوانای فوق، از این کد استفاده کنید؟

اینکه کدوم کد خوانا تر هست که یه امر سلیقه ایه ولی در کل میتونید stylecop (http://code.msdn.microsoft.com/sourceanalysis)نصب کنید و ببینید نظرش چیه.:چشمک:
موفق باشید.

mehdi.mousavi
چهارشنبه 06 آبان 1388, 19:24 عصر
اینکه کدوم کد خوانا تر هست که یه امر سلیقه ایه ولی در کل میتونید stylecop (http://code.msdn.microsoft.com/sourceanalysis)نصب کنید و ببینید نظرش چیه.:چشمک: موفق باشید.

سلام.
StyleCop در این مورد توصیه ای نداره و خوب، طبیعی هم هستش. خوانایی کد هم سلیقه ای نیستش و ...

در کل فقط یک توصیه بود که می تونید نادیده بگیریدش (که ظاهرا اینکارو کردید).

پاورقی:
You are not your code!

آرام جان گل
پنج شنبه 07 آبان 1388, 08:18 صبح
سلام

در صفحه login من وقتی Session را صدا می زنم نمی شناسه انگار NameSpace می خواد . آره؟

و دیگه اینکه چه اشکالی داره که یک تاپیک کلی در زمینه امنیت خود ASP.net قرار بدید.
سایت به این خوبی ، خوب این کار را هم بکنه

مرسی

Alireza Orumand
شنبه 09 آبان 1388, 13:45 عصر
سلام


در صفحه login من وقتی Session را صدا می زنم نمی شناسه انگار NameSpace می خواد . آره؟

هیچ Namespaceنیاز نداره اگر یک صفحه استاندارد استفاده کرده باشید. به خاطر احتیاط از HttpContext.Current.Session اسفاده کنید ببینید نتیجه چی میشه.


دیگه اینکه چه اشکالی داره که یک تاپیک کلی در زمینه امنیت خود ASP.NET قرار بدید.

اول زمان و دوم اینکه اینجا باید سوال پرسیده بشه و به سوالات جواب داده میشه.:چشمک:


StyleCop در این مورد توصیه ای نداره و خوب، طبیعی هم هستش

:متعجب::متعجب::متعجب::متعجب:: تعجب::متعجب::متعجب::متعجب::م عجب::متعجب::متعجب::متعجب::مت جب::متعجب::متعجب::متعجب::متع ب::متعجب::متعجب::متعجب:
لیست warningهایی که بعد از run کردن styleCop بوجود میاد رو با دقت بیشتری ملاحظه بفرمایید.


خوانایی کد هم سلیقه ای نیستش

تا اندازه زیادی سلیقه ای هست.
نکته: بعد از } باید به خط جدید بریم.
تمامی مواردی که داخل {} هست باید تو رفتگی داشته باشه.
قبل از شروع هر بلاک هم باید یک خط خالی باشه.
در کل شما یک بلاک رو در یک خط شروع کردید، در همون خط محتویاتش رو نوشتید و بعد هم در همون خط تمومش کردید، که از استاندارد به دوره.:چشمک:
اینا از مواردی هست که مربوط به خوانایی میشه و چک هم میشه و warning هم داره.
در مورد استفاده از اپراتور ?? به جای شرط if باز هم به نظر من این شرط if هست که کاملا خوانا هست و بیانگر همه چیز و ?? از موارد خلاصه نویسی هست و همونطور که صد در صد میدونید خلاصه نویسی با خوانا نویسی معمولا در تضاد هست.:لبخندساده:
در کل وقتی سوالی پرسیده میشه ترجیح میدم به سوال جواب بدم نه حاشیه.(قصد جسارت نداشتم) اگر هم جواب دادم صرفا به این خاطر بود که فرمایشات شما تا حدودی صحیح نبود.
بیشتر از این ادامه دادن بحث خوانایی و styleCop و ... در اینجا فکر میکنم سودی برای سوال پرسیده شده نداشته باشه.
موفق باشید.

mehdi.mousavi
شنبه 09 آبان 1388, 14:40 عصر
لیست warningهایی که بعد از run کردن styleCop بوجود میاد رو با دقت بیشتری ملاحظه بفرمایید.

سلام.
من از StyleCop 4.3 استفاده می کنم و تمام تنظیماتش Default هست. فقط SA1633 رو دستی Disable کردم که مربوط به File Header هاست و مطلقا هیچ Warning بهم نمیده:

------ StyleCop started ------

Pass 1: Default.aspx.cs...
Pass 2: Default.aspx.cs...

---------------------- Done ----------------------

Violation Count: 0

(تنها Comment های مربوط به Property رو به تعریف Property اضافه کردم).


تا اندازه زیادی سلیقه ای هست.
چندان موافق نیستم اگرچه سلائق نویسنده کد میتونه مستقیما بر خوانایی اون تاثیر بذاره و من منکر این موضوع نیستم.


نکته: بعد از } باید به خط جدید بریم.
در تعریف Property ها چنین چیزی صحت نداره. اگر من get accessor رو در بیش از یک خط بنویسم، بله. اونوقت چون set accessor در یک خط نوشته شده، با SA1504 در StyleCop مواجه خواهیم شد:

SA1504: An accessor can only be placed on a single line if all of the accessors in the property are placed on a single line.

اما هنگامیکه هر دو accessor در یک خط نوشته شدن، همه چی OK هست و مطلقا مشکلی وجود نداره.


تمامی مواردی که داخل {} هست باید تو رفتگی داشته باشه.
بدون شک اینطوره. کدی هم که در پستها قبلی بهش اشاره کردم، از این ویژگی پیروی می کرد.


قبل از شروع هر بلاک هم باید یک خط خالی باشه.
فقط در صورتی این Rule برقراره که get/set رو در بیش از یک خط بنویسیم. در اینصورت، بله، باید قبل از set accessor، یک خط خالی رد کنیم!


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

این نظر شماست. همونطور که گفتم، StyleCop نظر دیگه ای داره.


فرمایشات شما تا حدودی صحیح نبود.
امیدوارم نظرتون عوض شده باشه. موفق باشید.

m0rteza
شنبه 09 آبان 1388, 17:36 عصر
سلام
یک سوال :
من میام کد کاربر جاری رو در زمان Login در درون Session قرار می دم . و در طول برنامم دوست دارم این کد رو همراه اطلاعات دیگه ذخیره کنم .
آیا با ویزارد Asp.net که فرمودین می تونم کد کاربرم رو به راحتی ذخیره کنم ؟ یا مشخصات دیگری علاوه بر مشخصات موجود در ویزارد برای کاربرم تعریف کنم و در هر زمان به اونها دسترسی داشته باشم؟

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

iman_ad
شنبه 09 آبان 1388, 19:52 عصر
کلاس membeship در دات نت همه این کارارو انجام می ده، ولی از بین رفتن session چیز تازه ای نیست، معمولا بخاطر آنتی ویروس این اتفاق می افته. دوست من همیشه سعی کن خودکفا باشی، یک کتاب asp.net باز کنی همه انارو نوشته، سعی کن مسایلی مطرح کنی که نتونستی خودت حلش کنی، Wrox.Professional.ASP.NET.2.0.Security.Membership. and.Role.Management.Jan.2006.eBook-DDU
این کتاب کاملی نسخه 3.5 اون هم منتشر شده