我目前正在为一家软件公司工作。我有一个机制,一旦页面加载(在Page_OnLoad,Masterpage代码文件中)运行,创建一个自己的类的新实例并从那里运行一个函数。 一切都运行良好数周,我在网站上完全不同的页面/区域工作,不会影响我当前的事业。
所以发生以下情况: 我在asp.net开发服务器上试过这个网站:一切都很好,工作正常。所以我将它上传到我的IIS服务器。访问网站:一切仍在运行,没有错误。 大约20分钟后,我刷新了页面:NullReferenceException,无处不在。无论我做什么,现在我无法摆脱它。
这是来自堆栈的消息:
[NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.]
EITS.WWW.Helper.cUserLog.TrackUserLog(HttpRequest request) in C:\EIT\Projekte\eits.ch\www.eits.ch\EITSWeb\www.eits.ch\Includes\cUserLog.cs:72
EITS.WWW.IndexMaster.Page_Load(Object sender, EventArgs e) in C:\EIT\Projekte\eits.ch\www.eits.ch\EITSWeb\www.eits.ch\Index.Master.cs:22
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +24
System.Web.UI.Control.LoadRecursive() +70
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3063
母版页代码文件:
http://codetidy.com/3244/
被调用的类:
http://codetidy.com/3245/
答案 0 :(得分:1)
以下是抛出异常的代码部分:
String vSQL = "SELECT * FROM eits_visitor WHERE ip = '" + oUser.usrIP + "'";
DataTable dtCurrent = SQLCon.GetDataTableFromSQL(vSQL, oHelper.cfgConnection);
if (dtCurrent != null && dtCurrent.Rows.Count > 0) {
// Check if IP is registered today
vSQL = "SELECT TOP(1)* FROM eits_log WHERE visitor_ip = '" + oUser.usrIP + "' ORDER BY date DESC;";
dtCurrent = SQLCon.GetDataTableFromSQL(vSQL, oHelper.cfgConnection);
// Next line is where the exception is thrown:
if (SQLCon.DateFromString(dtCurrent.Rows[0]["date"].ToString()).DayOfYear != DateTime.Now.DayOfYear) {
// do stuff
}
}
问题在于第二个查询,你没有检查dtCurrent.Rows [0]是否存在。
在第一个查询中,您正在做正确的事情 - 检查dtCurrent.Rows.Count> 0之前做任何事情。您似乎只是假设因为第一个查询返回结果,第二个查询也会,但由于这是抛出异常的地方,您可能需要重新考虑这个假设。
您的评论说第二个查询的目的是“检查今天是否已注册IP”,但您实际上并未检查记录是否存在 - 您只是假设记录在那里并使用它,在没有这样的记录时使代码失败。
如果今天没有 注册,那么还有记录吗?如果没有,那就是你的问题所在。
我对此类问题的第一反应是添加一张支票,以确保我的假设是正确的:
if (dtCurrent.Rows.Count == 0)
throw new Exception("The unthinkable happened - our assumption was wrong!");
// Next line is where the exception was being thrown before.
// Do we still get this far now?
if (SQLCon.DateFromString(dtCurrent.Rows[0]["date"].ToString()).DayOfYear != DateTime.Now.DayOfYear) {
// do stuff
}