PDA

View Full Version : سوال: سوال تعریف متغیر سراسری در ASP



Gol_narjes
سه شنبه 21 آبان 1387, 14:45 عصر
زمانیکه کاربرم user,pass خود را وارد کرد در صفحه بعد می خواهم به او سلام کنم اما نمی دانم چه کسی وارد شده؟ می خواستم از متغیر سراسری استفاده کنم اما در کدهایی که در داخل تگ html نوشته می شود این کار شدنی نیست .لطفا مرا راهنمایی کنید:تشویق:

benyamin mirzai
سه شنبه 21 آبان 1387, 14:49 عصر
می توانید username کاربر را در یک session ذخیره کنید و در صفحه بعد استفاده کنید

Gol_narjes
سه شنبه 21 آبان 1387, 14:58 عصر
می توانید username کاربر را در یک session ذخیره کنید و در صفحه بعد استفاده کنید


با سشن ها کار نکردم می توانید بیشتر راهنمایی ام کنید

kiosksoft
سه شنبه 21 آبان 1387, 15:01 عصر
روش مقدار دادن به یک session :


Session["user"]="asp.ok";


روش گرفتن مقدار یک session:


string user=Session["user"].ToString();

benyamin mirzai
سه شنبه 21 آبان 1387, 15:21 عصر
session["uname"] = usernametxt.text;




ودر صفحه خوش امد گویی اونو می خونی




usernamelbl= session["uname"].tostring();

ali_sorouri2005
سه شنبه 21 آبان 1387, 17:00 عصر
از querystring هم ميشه استفاده كرد كه مشكل expire شدن سشن رو نداره.البته فقط براي ارسال username

merlin_vista
سه شنبه 21 آبان 1387, 20:50 عصر
از querystring هم ميشه استفاده كرد كه مشكل expire شدن سشن رو نداره.البته فقط براي ارسال username

بهترين راه براي اين كار استفاده از Cache است . در سايت جستجو كنيد !!!

ali_sorouri2005
چهارشنبه 22 آبان 1387, 10:40 صبح
يعني چي؟
يعني مقدار session بايد cash بشه؟؟
و حالا اگر cash شد امكان نداره كش خالي بشه؟
بيشتر توضيح بدين ممنون ميشم.

hamed aj
چهارشنبه 22 آبان 1387, 12:08 عصر
از querystring هم ميشه استفاده كرد كه مشكل expire شدن سشن رو نداره.البته فقط براي ارسال username

بهترين راه براي اين كار استفاده از Cache است . در سايت جستجو كنيد !!!


یعنی با caching متغیر global تعریف کنیم؟
میشه یک مثال بزنید؟

merlin_vista
چهارشنبه 22 آبان 1387, 13:45 عصر
اگر جستجو ميكرديد زودتر به نتيجه ميرسيديد :

قرار دادن اطلاعات در شئ Cache به اين صورت ميباشد (با استفاده از متد insert اين شئ)

Cache.Insert("name", this.TextBox1.Text,null,DateTime.MaxValue,new TimeSpan(1,0,0,0,0));

همان گونه كه در اين مثال ميبينيد :
"name" = نام شئ كلاس براي استفاده هاي بعدي :
this.TextBox1.Text = اطلاعاتي است كه در اين شئ قرار ميگيره ( ميتونه از هر جايي بياد مثل بانك و . . )
null = يه متد از نوع System.Web.Caching.CacheDependency ميگيره كه در اينجا null داديم
DateTime.MaxValue = absoluteExpiration

new TimeSpan(1,0,0,0,0) = مدت زماني كه اطلاعات در Cache باقي بماند .
اطلاعات بيشتر از MSDN در مورد پارامتر هاي متد insert :

Parameters
key
Type: System..::.String

The cache key used to reference the object.

value
Type: System..::.Object

The object to be inserted in the cache.

dependencies
Type: System.Web.Caching..::.CacheDependency

The file or cache key dependencies for the inserted object. When any dependency changes, the object becomes invalid and is removed from the cache. If there are no dependencies, this parameter contains nullNothingnullptra null reference (Nothing in Visual Basic).

absoluteExpiration
Type: System..::.DateTime

The time at which the inserted object expires and is removed from the cache. To avoid possible issues with local time such as changes from standard time to daylight time, use UtcNow rather than Now for this parameter value. If you are using absolute expiration, the slidingExpiration parameter must be NoSlidingExpiration.

slidingExpiration
Type: System..::.TimeSpan

The interval between the time the inserted object is last accessed and the time at which that object expires. If this value is the equivalent of 20 minutes, the object will expire and be removed from the cache 20 minutes after it was last accessed. If you are using sliding expiration, the absoluteExpiration parameter must be NoAbsoluteExpiration.




خواندن اطلاعات از Cache

if (Cache.Get("name") != null)
{
this.Label1.Text = Cache.Get("name").ToString();
}
else
{
this.Label1.Text = "اطلاعاتي براي نمايش وجود ندارد";
}



پاك كردن اطلاعات از Cache :

Cache.Remove("name");

اگر علاقمند به اين شئ دوست داشتني هستنيد .. حتماً در MSDN و يا اين سايت Search كنيد .

با تشكر ...

Behrouz_Rad
چهارشنبه 22 آبان 1387, 16:46 عصر
merlin_vista@
روشی که برای خواندن اطلاعات از Cache پیشنهاد دادی صحیح نیست!
دلیلش رو در مطلبی که در لینک ذیل می بینی نوشتم:
http://brad.barnamenevis.org/?p=107

موفق باشید.

ali_sorouri2005
چهارشنبه 22 آبان 1387, 17:43 عصر
ممنون.
فقط مي خوام بدونم در اين حالت اطلاعاتي كه كش شده خود به خود از بين نميره؟
يعني مدت زمانش بستگي به سرور نداره؟
چون واسه سشن هم مدت تعيين مي شد ولي زود تر از اون زمان به دليل شلوغي سرور expire مي شد!
لطفا نحوه تنظيم timspan رو هم توضيح بدين.

با تشكر

merlin_vista
پنج شنبه 23 آبان 1387, 10:06 صبح
merlin_vista@
روشی که برای خواندن اطلاعات از Cache پیشنهاد دادی صحیح نیست!
دلیلش رو در مطلبی که در لینک ذیل می بینی نوشتم:
http://brad.barnamenevis.org/?p=107

موفق باشید.

ممنون آقاي راد از راهنمايي كه كرديد اين موضوع را كاملاً فراموش كرده بودم :

string strname = Cache["name"] as string;
if (strname != null)
{
this.Label1.Text = strname;
}
else
{
this.Label1.Text = "اطلاعاتي براي نمايش وجود ندارد";
}



فقط مي خوام بدونم در اين حالت اطلاعاتي كه كش شده خود به خود از بين نميره؟
پس زمان Expier را براي چي تعيين ميكنيم دوست عزيز . با خيال راحت ازش استفاده كن .


يعني مدت زمانش بستگي به سرور نداره؟
خودمان داريم تعيين ميكنيم .


چون واسه سشن هم مدت تعيين مي شد ولي زود تر از اون زمان به دليل شلوغي سرور expire مي شد!
خير . فكر نكم اين موضوع براي كش صدق كنه . البته بايد نظر آقاي راد هم درباره اين موضوع جويا شد .


لطفا نحوه تنظيم timspan رو هم توضيح بدين.


new TimeSpan("days","hours","minutes","seconds","milliseconds")

فكر ميكنم خود كد بالا گويا باشه .

iman_ad
یک شنبه 26 آبان 1387, 15:34 عصر
کش بدرد این کار نمی خوره چون شما که نمی تونی برای هر کاربر یک متغییر کش کنی، باید از session استفاده کنی که اگر از authentication خود .net استفاده کنی می تونی یا از کنترل LoginName تو صفحت استفاده کنی و یا


MembershipUser user;
string username;
user = Membership.GetUser();
username = user.UserName;

این تو روال page_load قرار بدی رشته username، یوزر جاری نشون می ده.

ali_sorouri2005
دوشنبه 27 آبان 1387, 22:45 عصر
خوب يه مشكل ديگه!
توي sqldatasource چه جوري بايد بگيم متغير از cash بخونه؟؟؟
چون تو ويزاردش فقط session,querystring داره!اصلا cash نداره!

با تشكر

mahdi_farhani
دوشنبه 27 آبان 1387, 23:09 عصر
کش بدرد این کار نمی خوره چون شما که نمی تونی برای هر کاربر یک متغییر کش کنی، باید از session استفاده کنی
در نتیجه شما باید برای هر کاربر یک Session تعریف کنی !!!!!!!!!!!! آیا Session برای نگه داشتن یک همچین مورد امن هست ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

iman_ad
سه شنبه 28 آبان 1387, 04:14 صبح
یعنی چی امن هست؟ می خواد username داخل session قرار بده نه password
دوما نیازی به session هم نیست کلاس memebership یک متد داره به نام GetUser که اگه ایشون از authentication خود .net استفاده کنند همان طوری که توضیح دادم به خوبی کار می کنه.
آقا مهدی شما درک درستی از cookie،session و catch ندارید

hassanf
سه شنبه 28 آبان 1387, 05:37 صبح
روش نگهداری اطلاعات و انتقال آنها بین فرم ها :

1.QueryString : در این روش اطلاعات بین فرم ها از طریق پارامتر زوی آدرس URl ارسال می شوند.


Responce.Redirect("Form1.aspx?Id=1");


و در صفحه مقصد :


String Id = Request.QueryString("Id").ToString();


به دلیل قابل مشاهده بودن QueryString اطلاعات مهم را با این روش ارسال نمیکنیم. مثلا برای انتقال شماره صفحه اطلاعاتی که باید نمایش داده شود مناسب است.

2.Cookie : کوکی ها برای ذخیره سازی اطلاعات روی کامپوتر کاربر استفاده می شوند.

3.ViewState :در این روش اطلاعات روی فرم ذخیره می شوند.


ViewState["Id"] = "Name";

در واقع اطلاعاتی که در این روش ذخیره می شوند فقط توسط همان فرم قابل بازیابی هستند.

4.Session : اطلاعات در این روش روی حافظه Server ذخیره می شوند.اطلاعات ذخیره شده در Session فقط توسط کاربری که آن را ایجاد کرده است قابل دسترس است که از آن می توان برای نگهداری اطلاعات کاربران که از نظر امنیتی مهم است استفاده کرد.نکته ای که باید به آن توجه کرد این است که Session ها دارای TimeOut بوده و پس از آن از بین می روند.


Session["Id"] = 1;


5. Application : در این روش از Application همانند Session برای ذخیره سازی و بازیابی اطلاعات استفاده می شود . تنها تفاوت این است که مقادیر ذخیره شده برای کلیه کاربران و فرم ها یکسان است. مثلا از آن می توان برای محاسبه کاربران OnLine استفاده کرد.



Application["Message"] = "Message";

hassanf
سه شنبه 28 آبان 1387, 06:55 صبح
Asp.net هم چنین کش کردن Data به عنوان Object را ساپورت می کند.در این خالت اطلاعات در حافظه ذخیره می شوند و همانند Application توسط تمامی صفحات قابل دسترس هستند.

اطلاعات را به دو صورت زیر می توانیم در Cache ذخیره کنیم :



Catche["Name"] = "YourName";

Cache.Insert("Nane", YourName,
CatcheDependency(Server.MapPath("Name.txt",
DataTime.Now.AddMinute(20),
TimeSpan.Zero);



در روش دوم
1. پارامتر اول Key
2.پارامتر دوم Objectکه می خواهیم ذخیره کنیم
3.پارامتر سوم وابستگی به فایلی که پس از تغییر در آن Cache پاک می شود
4.پارامتر چهارم مدت زمانی است که پس از آن Cache پاک می شود.

در هنگام استفاده از Cache باید به نکات زیر توجه کرد :
در صورتی که حافظه کم شود Cache تحت پروسسی با نام Scavengingبه طور خودکار پاک می شود.
Data یا Object که کش شده است در تمام صفحات قابل دسترس و مشترک است.
میتوان به Catche اولویت حذف از حافظه در صورت کمبود خافظه را مشخص کرد.


Cache.Insert("Nane", YourName,
CatcheDependency(Server.MapPath("Name.txt",
DataTime.Now.AddMinute(20),
TimeSpan.Zero,
CacheItemPriority.High,
null);

ali_sorouri2005
سه شنبه 28 آبان 1387, 09:40 صبح
يه نفر جواب منو آخر نداد!
چه جوري متغير هاي كوئري داخل datasource ميتونن از كش بخونن؟؟؟؟؟؟

با تشكر

Saber_Fatholahi
سه شنبه 28 آبان 1387, 13:05 عصر
خوب دوست من باید خودت دستی بخونی بعد اونو به صورت پارامتر توی پارامتر دیتا سورست بریزی

mahdi_farhani
سه شنبه 28 آبان 1387, 14:35 عصر
یعنی چی امن هست؟ می خواد username داخل session قرار بده نه password
دوما نیازی به session هم نیست کلاس memebership یک متد داره به نام GetUser که اگه ایشون از authentication خود .net استفاده کنند همان طوری که توضیح دادم به خوبی کار می کنه.
آقا مهدی شما درک درستی از cookie،session و catch ندارید
اولاً شما با چه سنگی محکی مرا سنجیدن که من درک درستی از از این چیزها ندارم .......
ثانیاحرفه ایی هایی که من میشناسم ، سراغ Membership دات نت برای تعیین هویت برنامه هاشون نرفتن ، به n دلیل که ایجا جاش نیست.
FormsAuthentication هم میتونید استفاده کنید و هیچ نیازی به Membership ندارید .
ما از همون اول هم گفتیم Session نمیخواهد !
برای اطلاع بگم username هم برای مسائل امنیتی مهمه ،،،،،،،،،،،،،،،،،،،،

iman_ad
سه شنبه 28 آبان 1387, 15:53 عصر
آقای حرفه ای Forms Authentication همون قابلیتAuthentication فرم ورک برای وب و کلاس Membership هم مربوط به شناسایی کاربران، اضافه کردن و ....
محض اطلاع شما session به 2 صورت قابل ذخیرست یکی cookie یکی داخل دیتابیس، رو دیتابیس امن نیست!!!!!!!
هر درخواست در برنامه تحت سرور یک application محسوب می شه، اگه شما username یک کاربر catch کنی داخل memory سرور ذخیره می شه حالا کاربر بعدی که لاگین می کنه باید این catch تغییر بده !!!!!!!!
نکه اینکه لقمرو .... کنی برای هر کار یک guid تعریف کنی و یک array که حاوی guid و username کاربران باشه و array کش کنی تازه باید guid هر کاربر را با session یا cookie برای هر کاربر save کنی.

mahdi_farhani
سه شنبه 28 آبان 1387, 16:17 عصر
آقای حرفه ای Forms Authentication همون قابلیتAuthentication فرم ورک برای وب و کلاس Membership هم مربوط به شناسایی کاربران، اضافه کردن و ....
محض اطلاع شما session به 2 صورت قابل ذخیرست یکی cookie یکی داخل دیتابیس، رو دیتابیس امن نیست!!!!!!!
هر درخواست در برنامه تحت سرور یک application محسوب می شه، اگه شما username یک کاربر catch کنی داخل memory سرور ذخیره می شه حالا کاربر بعدی که لاگین می کنه باید این catch تغییر بده !!!!!!!!
نکه اینکه لقمرو .... کنی برای هر کار یک guid تعریف کنی و یک array که حاوی guid و username کاربران باشه و array کش کنی تازه باید guid هر کاربر را با session یا cookie برای هر کاربر save کنی.
اولا من حرفه ایی نیستم ، ثانیاً کسی حرف شما رو نقض نکرد و فقط من گفتم احتیاج نیست از Membership استفاده کنه ، چونMembership زمانی استفاده میشه که شما احتیاج به LoginControl داشته باشی ، و کسی اینجا از loginControl دات نت استفاده نمیکنه .

هر درخواست در برنامه تحت سرور یک application محسوب می شه ،،، یعنی شما میگین Request = Application اینو با یک منبع موسق به من نشون بدید .

hassanf
سه شنبه 28 آبان 1387, 16:25 عصر
اساتید محترم لطفا به صفحه قبل پست 18 و 19 نگاهی بیندازید.

iman_ad
سه شنبه 28 آبان 1387, 17:08 عصر
من همچین چیزی نگفتم ، گفتم اگه کاربر x صفحه در خواست کنه یک نمونه از برنامه و اگه y درخواست کنه یک نمونه دیگه اجرا می شه. باید می گفتم thread

iman_ad
سه شنبه 28 آبان 1387, 18:55 عصر
publicpartialclassDefault2 : System.Web.UI.Page
{
protectedvoid Page_Load(object sender, EventArgs e)
{
Cache.Insert("userCacheID", 3, null, DateTime.MaxValue, newTimeSpan(1, 0, 0, 0, 0));

}
protectedvoid SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{

int userID=(int)Cache["userCacheID"] ;
e.Command.Parameters[0].Value = userID;


}
}




<formid="form1"runat="server">
<div>
&nbsp;<asp:SqlDataSourceID="SqlDataSource1"runat="server"ConnectionString="<%$ ConnectionStrings:dbhazartebConnectionString %>"
SelectCommand="SELECT * FROM [tbl_product] WHERE ([PID] = @PID)"OnSelecting="SqlDataSource1_Selecting">
<SelectParameters>
<asp:ParameterName="PID"Type="Int32"Size="2"/>
</SelectParameters>
</asp:SqlDataSource>

</div>
<asp:GridViewID="GridView1"runat="server"AutoGenerateColumns="False"DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundFieldDataField="PID"HeaderText="PID"SortExpression="PID"/>
<asp:BoundFieldDataField="p_name"HeaderText="p_name"SortExpression="p_name"/>
<asp:BoundFieldDataField="p_CID"HeaderText="p_CID"SortExpression="p_CID"/>
<asp:BoundFieldDataField="p_SID"HeaderText="p_SID"SortExpression="p_SID"/>
<asp:BoundFieldDataField="p_link1"HeaderText="p_link1"SortExpression="p_link1"/>
<asp:BoundFieldDataField="p_image"HeaderText="p_image"SortExpression="p_image"/>
<asp:BoundFieldDataField="p_top"HeaderText="p_top"SortExpression="p_top"/>
<asp:BoundFieldDataField="p_dec"HeaderText="p_dec"SortExpression="p_dec"/>
</Columns>
</asp:GridView>
</form>

فکر کنم جواب سوالت گرفته باشی اولین پارامتر SelectCommand با کش مقدار دهی کردم