PDA

View Full Version : سوال: رخ دادن خطای Object reference not set to an instance of an object. مربوط به سشن



پروگرامنویس
جمعه 07 تیر 1392, 11:59 صبح
درود بر دوستان
من توی پروژم دوجا از سشن بهره بردم یکی واسه لاگین کردن ادمین و یکی هم برای تولید captcha برای صفحه دیدگاه های کاربران.نکته انجاس که همیشه با این خطا روبرو نمیشم و زمانیکه این پیغام میاد یا باید بک کنم و لاگ اوت شم یا کلا پروژه رو از نو ران کنم و اینکه معلوم نیست منطق این پیغام چیه چون من timeout سشن رو روی 60 دقیقه گذاشتم و این خطا خیلی زودتر نشون داده میشه من تایم اوت رو هم توی کد نویسی آزمایش کردم و هم توی وب کانفیگ اما انگار ایراد از این نیست!براتون پیکره و کدهای هر دو رو میزارم اگه کمک کنید بسیار سپاسگزار میشم!
پیکره رخ دادن پیغام سشن ادمین:
http://upcity.ir/images2/58269565349430742353.png
کدهای متد لود و دکمه صفحه لاگین:


protected void Page_Load(object sender, EventArgs e)
{
if (Session["adm"] != null && Session["rle"].ToString() == "mg")
{
Response.Redirect("profile.aspx");
return;
}

//if (Session["adm"] != null && Session["rle"].ToString() == "wr")
//{
// Response.Redirect("wprofile.aspx");
// return;
//}
}
protected void btnlog_Click(object sender, EventArgs e)
{
Mngr mg = new Mngr();
mg.UserName = txtuser.Text;
mg.Password = txtpass.Text;
bool b = mg.LoginMngr();
if (b==true)
{
if (mg.State == "پویا")
{
if (mg.Role == "سرپرست")
{
Session.Add("adm", txtuser.Text);
//Session.Timeout = 60;
Response.Redirect(@"profile.aspx");
return;
}
//else
//{
// Session.Add("adm", txtuser.Text);
// Session.Add("rle", "wr");
// Session.Timeout = 60;
// Response.Redirect(@"wprofile.aspx");
// return;
//}
}
else
lblLog.Text = "حساب کاربری شما بسته شده است،برای چرایی آن با سرپرست سایت تماس بگیرید";
}
else
{
lblLog.Text = "نام کاربری / گذرواژه درست نمی باشد!";
}
}

کدهای متد لود مسترپیج:


if (Session["adm"] == null)
{
Response.Redirect(@"login.aspx");
return;
}
Mngr mg = new Mngr();
mg.UserName = Session["adm"].ToString();
mg.SelectInfo();


پیکره پیغام خطای مربوط به سشن captcha
http://upload7.ir/images/81176124488098193429.png
سناریوی تولید capcha: توی یه صفحه یه نوشته تصادفی رو تولید میکنم و اونو به یه عکس میدم و بعد به وسیله سشن پاسش میدم به خاصیت سورس شی ایمیج در صفحه دیدگاهها.
کد متد لود صفحه تولید captcha:


protected void Page_Load(object sender, EventArgs e)
{
//Random
string[] cpt = {"blue","green","black","white","tehran","semnan","esfahan","shiraz","tabriz","ahvaz" };
Random r = new Random();
int num = r.Next(100, 1000);
int i = r.Next(0, 9);
string v = cpt[i] + num.ToString();
Session.Add("cpch", v);
//
//load image
string path = Server.MapPath(".");
System.Drawing.Image mg= System.Drawing.Image.FromFile(path+"\\img\\capcha.png");
//
//Create Graphic
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(mg);
//
//Wright
Font f = new Font("Arial", 12, FontStyle.Bold);
g.DrawString(v, f, Brushes.Blue, 2, 5);
g.DrawLine(Pens.Black, 0, 5, 100, 35);
//
//stream
Stream st = new MemoryStream();
mg.Save(st, System.Drawing.Imaging.ImageFormat.Png);
//
//convert stream to byte[]
st.Position = 0;
byte[] b = new byte[st.Length];
st.Read(b, 0, b.Length);

Response.Clear();
Response.ContentType = "image/png";
Response.OutputStream.Write(b, 0, b.Length);
Response.End();

}

متد لود و دکمه صفحه دیدگاه ها:


protected void Page_Load(object sender, EventArgs e)
{
File fl = new File();
Payam pm = new Payam();
if (Request["nc"] == null)
{
fl.ID = Int32.Parse(Request["fid"]);
pm.pstID = Request["fid"];
}
else
{
fl.ID = Int32.Parse(Request["nc"]);
pm.pstID = Request["nc"];
}

DataTable dt = fl.SelectPostsByID();
rptfle.DataSource = dt;
rptfle.DataBind();
DataTable dtc = pm.SelectCmntOk();
rptcmnt.DataSource = dtc;
rptcmnt.DataBind();
}


protected void btnCmnt_Click(object sender, EventArgs e)
{
string strc = Session["cpch"].ToString();
Session.Remove("cpch");
if (txtCapch.Text != strc)
{
lblmsg.Text = "کد امنیتی درست نیست!";
return;
}
else
{
Payam pm = new Payam();
pm.cName = txtName.Text;
pm.cCmnt = txtCmnt.Text;
pm.pstID = Request["fid"];
pm.AddCmnt();
Response.Redirect("onefile.aspx?nc=" + Request["fid"]);
lblmsg.Text = "دیدگاه شما با پیروزی در سایت نگاشته شد!";
return;
}
}

fakhravari
جمعه 07 تیر 1392, 13:25 عصر
عزيز دل برادر مگه شما همين مطلب چند وز پيش پست نزده بوديد.
سشن همين طوري

پروگرامنویس
جمعه 07 تیر 1392, 23:05 عصر
عزيز دل برادر مگه شما همين مطلب چند وز پيش پست نزده بوديد.
سشن همين طوري

سشن همینطوریه؟ یعنی طبیعیه؟ماکروسافت فکری بحالش نکرده!!!؟

mehdi.mousavi
پنج شنبه 13 تیر 1392, 07:10 صبح
سلام.
قبل از اینکه بخوام بهتون پاسخ سوال رو بدم، کاری که بهتون میگم رو لطفا انجام بدید (با هم تعارف نداریم که، کدی که نوشته اید واقعا نافرم هستش!).
قبل از هر چیز، کد رو Refactor کنید، به این معنی که کد رو به توابع و Property های دیگه ای تقسیم کنید که مجبور نباشید یه خروار کار رو همینطور
پشت سر هم انجام بدید و کد خوانا بشه. این، از هر چیزی برای شما واجب تر هستش. وقتی کد در هم و بر هم باشه، نه من و نه هیچ کس دیگه رغبتی
به دیدن اون از خودش نشون نمیده، چه برسه بخواد خطاهای احتمالی کد شما رو متوجه بشه و اونها رو بهتون بگه...

بطور مثال، این چند خط رو نگاه کنید:


string[] cpt = {"blue","green","black","white","tehran","semnan", "esfahan","shiraz","tabriz","ahvaz" };
Random r = new Random();
int num = r.Next(100, 1000);
int i = r.Next(0, 9);
string v = cpt[i] + num.ToString();

اینو به یک تابع منتقل کنید، اسم تابع رو بذارید (فرضا) GetRandomToken که وظیفش برگردوندن یکی از این Token ها بصورت تصادفی باشه...

با فرضا، برای Set کردن و Get کردن متغیر ها در Session، از این Pattern استفاده کنید:

public string Token
{
get { return Session["Token"] ?? string.Empty; }
set { Session["Token"] = value; }
}


بدین ترتیب لازم نیست هر جا که نیاز شد، مدام بصورت مستقیم با Session کار کنید و Set کردن و Get کردن متغیر رو به این Property میسپرید.
طبیعتا برای هر متغیری که در Session می خواهید نگهداری کنید، یه دونه از این Accessor ها باید بنویسید.

این جدا سازی ها، در وهله اول به خودتون کمک می کنه که روی کد نوشته شده، کنترل داشته باشید. از طرفی وقتی جایی ایرادی پیش بیاد،
با تغییر یه Property یا Function مشکل رو می تونید حل کنید، اما الان، باید توی کد Search کنید و یه تغییر ساده رو N جا اعمال کنید...

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

موفق باشید.