IIS / ASP.net上的NullReferenceException - 无处不在?

时间:2012-08-06 13:16:06

标签: c# asp.net iis web-applications webserver

我目前正在为一家软件公司工作。我有一个机制,一旦页面加载(在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/

1 个答案:

答案 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
}