PDA

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



پروگرامنویس
چهارشنبه 05 تیر 1392, 17:02 عصر
درود به دوستان
همونجور که توی سرنام نوشتم این خطا دلبخواهی رخ میده .وقتی برای چک کردن حساب کاربری و یا استفاده از capcha از session استفاده میکنم گاهی این پیغام رو میده اما بعد از بستن پروژه و دوباره اجرا گرفتن درست میشه.خواهشمندم راهنمای کنید کلافم کرده.
http://upload7.ir/images/81176124488098193429.png

General-Xenon
چهارشنبه 05 تیر 1392, 17:23 عصر
درود به دوستان
همونجور که توی سرنام نوشتم این خطا دلبخواهی رخ میده .وقتی برای چک کردن حساب کاربری و یا استفاده از capcha از session استفاده میکنم گاهی این پیغام رو میده اما بعد از بستن پروژه و دوباره اجرا گرفتن درست میشه.خواهشمندم راهنمای کنید کلافم کرده.
http://upload7.ir/images/81176124488098193429.png

سلام . ببین Session وقتی بسته بشه چه اتفاقی خواهد افتاد ؟ طبیعتا دیگه نداریش . حالا شما ToString هم میکنیش . دیگه بد تر ..
if (Session["x"] != null && Session["x"].ToString() == ""/* Shart 2 */) { }

پروگرامنویس
چهارشنبه 05 تیر 1392, 17:57 عصر
ممنون
میشه این خطی رو که نوشتی رو توضیح بدی ؟
راستش چیزی دستگیرم نشد!

fakhravari
چهارشنبه 05 تیر 1392, 20:42 عصر
در try بزار

پروگرامنویس
چهارشنبه 05 تیر 1392, 20:46 عصر
سلام . ببین Session وقتی بسته بشه چه اتفاقی خواهد افتاد ؟ طبیعتا دیگه نداریش . حالا شما ToString هم میکنیش . دیگه بد تر ..
if (Session["x"] != null && Session["x"].ToString() == ""/* Shart 2 */) { }

ممنون
میشه این خطی رو که نوشتی رو توضیح بدی ؟
راستش چیزی دستگیرم نشد!

پروگرامنویس
چهارشنبه 05 تیر 1392, 20:48 عصر
در try بزار

یعنی مشکل با try حل میشه یا منظورتون اینکه توی try تست بگیرم؟

General-Xenon
چهارشنبه 05 تیر 1392, 22:07 عصر
ممنون
میشه این خطی رو که نوشتی رو توضیح بدی ؟
راستش چیزی دستگیرم نشد!

ببین دوست من . Session رو اگر یک object در نظر بگیری، مقدار درش هست یا نیست . از این دو حالت خارج نیست.اگر پر بود حالا می تونی ویرایش کنی. کدی که شما نوشته بودی Session خالی بود . یعنی هیچی توش نبود . وقتی چیزی درش نیست چطوری تبدیل به String کنه ؟ . پس قبل از تبدیل باید بررسی کنی که اصلا چیزی درش هست یا نا . اصلا وجود داره این Session یا نه ..

پروگرامنویس
چهارشنبه 05 تیر 1392, 22:50 عصر
ببین دوست من . Session رو اگر یک object در نظر بگیری، مقدار درش هست یا نیست . از این دو حالت خارج نیست.اگر پر بود حالا می تونی ویرایش کنی. کدی که شما نوشته بودی Session خالی بود . یعنی هیچی توش نبود . وقتی چیزی درش نیست چطوری تبدیل به String کنه ؟ . پس قبل از تبدیل باید بررسی کنی که اصلا چیزی درش هست یا نا . اصلا وجود داره این Session یا نه ..

نه اینور نیست!ایراد از من بود که کدها رو کامل ننوشتم.
ببین سناریو اینه:
توی یه صفحه ای کاربران میخوان نظر بدن واسه امنیت بیشتر از capch استفاده کردم حالا چطور.
من توی متد لود یه صفحه ای کدهای زیر رو نوشتم این صفحه فقط یه تصویر با نوشته های تصادفی تولید میکنه.هنگامی که صفحه مربوط به نظر دادن لود میشه صفحه capch توی شی image در صفحه دیدگاه ها لود میشه و capch رو نشون میده .حالا من برای پاس دادن تصویر صفحه capch به صفحه دیدگاه ها برای مقایسه اون با مقدار وارد شده توسط کاربر از سشن استفاده کردم.
کدهای صفحه capch:


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)
{

if (txtCapch.Text != Session["cpch"].ToString())
{
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"]);
return;
}
}


تگهای مربوطه صفحه دیدگاه ها:


<div class="dv-input"><img alt="" src="capch.aspx" class="img-capch" id="imgc" /> شی ایمیجی که صفحه cpch در اون لود میشه
<input id="Button1" type="button" class="btn-ref" onclick="ref()" /> دکمه رفرش کردن capch
</div>

کد متد لاگین:


public bool LoginMngr()
{
db1.Connect();
sql = "Select rle,stt From t_mngr Where usrname=N'{0}' And pass=N'{1}' ";
sql = string.Format(sql, this.UserName.Replace(" ' ", " ' ' "), this.Password.Replace(" ' ", " ' ' "));
DataTable dt = db1.Select(sql);
db1.Disconnect();
if (dt.Rows.Count <= 0)
return false;
else
{
this.Role = dt.Rows[0]["rle"].ToString();
this.State = dt.Rows[0]["stt"].ToString();
return true;
}
}

کدهای صفحه لاگین کردن ادمین


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.Add("rle", "mg");
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();
........


گمون کنم همه چی رو نوشتم .با همه این تفاسیر گاهی این پیغام نشون داده میشه و گاهی نه.

General-Xenon
پنج شنبه 06 تیر 1392, 04:15 صبح
نه اینور نیست!ایراد از من بود که کدها رو کامل ننوشتم.
ببین سناریو اینه:
توی یه صفحه ای کاربران میخوان نظر بدن واسه امنیت بیشتر از capch استفاده کردم حالا چطور.
من توی متد لود یه صفحه ای کدهای زیر رو نوشتم این صفحه فقط یه تصویر با نوشته های تصادفی تولید میکنه.هنگامی که صفحه مربوط به نظر دادن لود میشه صفحه capch توی شی image در صفحه دیدگاه ها لود میشه و capch رو نشون میده .حالا من برای پاس دادن تصویر صفحه capch به صفحه دیدگاه ها برای مقایسه اون با مقدار وارد شده توسط کاربر از سشن استفاده کردم.
کدهای صفحه capch:


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)
{

if (txtCapch.Text != Session["cpch"].ToString())
{
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"]);
return;
}
}


تگهای مربوطه صفحه دیدگاه ها:


<div class="dv-input"><img alt="" src="capch.aspx" class="img-capch" id="imgc" /> شی ایمیجی که صفحه cpch در اون لود میشه
<input id="Button1" type="button" class="btn-ref" onclick="ref()" /> دکمه رفرش کردن capch
</div>

کد متد لاگین:


public bool LoginMngr()
{
db1.Connect();
sql = "Select rle,stt From t_mngr Where usrname=N'{0}' And pass=N'{1}' ";
sql = string.Format(sql, this.UserName.Replace(" ' ", " ' ' "), this.Password.Replace(" ' ", " ' ' "));
DataTable dt = db1.Select(sql);
db1.Disconnect();
if (dt.Rows.Count <= 0)
return false;
else
{
this.Role = dt.Rows[0]["rle"].ToString();
this.State = dt.Rows[0]["stt"].ToString();
return true;
}
}

کدهای صفحه لاگین کردن ادمین


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.Add("rle", "mg");
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();
........


گمون کنم همه چی رو نوشتم .با همه این تفاسیر گاهی این پیغام نشون داده میشه و گاهی نه.

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

fakhravari
پنج شنبه 06 تیر 1392, 11:03 صبح
سشن در يك try چك كن

پروگرامنویس
پنج شنبه 06 تیر 1392, 13:41 عصر
ببین دوست من Session یک بازه زمانی داره . وقتی Session بسته میشه اروره Null Object رو بر میگردونه. اگر همه این عملیات و سناریو رو سریع انجام بدی مشگلی نخواهی داشت . اما با مرور زمان که Session بسته می شه و تو نمی تونی بفهمی که کی Session بسته می شه، به مشکل بر می خوری. کد هات نا تمام خواهد ماند... موفق باشی .


Session.Timeout = 60;
دوست عزیز همینجور که میبینید من واسه سشن لاگین، 60 دقیقه زمان تعریف کردم که کم نیست و این اررور رو تو مدت زمان بسیار کمتر از این نشون داده میشه! درضمن من درباره کدهام یه جا رو اشتباه براتون بیان کردم.اون متد لودی که میاد سشن ادمین رو چک میکنه مربوط به صفحه پروفایل نیست من اون کد رو توی مسترپیج نوشتم.البته گمون نکنم فرقی داشته باشه و مشکل ازین باشه. بازم سپاس از کمکتون