捕获使 IIS 网站崩溃的 NullReferenceException

catching NullReferenceException that crashes IIS website

我有一个 .Net 4.6 Web 应用程序,它有一个长期但间歇性的问题,即错误发生,总是在同一个地方,导致 IIS 崩溃。

Web 应用程序每天都在使用,但并非每天都会出现此错误。但是当它确实出错并使网站崩溃时,它总是在同一条线上。

这是错误:

[NullReferenceException: 对象引用未设置到对象的实例。] SecureUserCheck..ctor(数据集 secureData)在 e:\gameServer\SecureUserCheck.vb:160

下面是 "ds" 的初始化方式:

Dim ds As Data.DataSet = Session("secureData")

    If IsNothing(ds) Then
        ds = getSecureDS(gameID)
        Session("secureData") = ds
    End If

下面是 SecureUserCheck.vb 第 160 行:

inhSec = New SecureUserCheck(ds)

    Public Sub New(ByVal secureData As DataSet)

        If secureData Is Nothing Then
            Throw New System.ArgumentException("secureData in empty.")
        Else
            startTime = DateTime.Now
            Try
                myGameInfo = secureData.Tables("GameInfo")   // LINE 160
            Catch ex As Exception
                Throw New System.ArgumentException("The secureData must contain [GameInfo] table.")
            End Try
            With myGameInfoRows(0)
            ...fill variables
           End With

我尝试将其包装在 Try Catch 块中,但似乎从未抛出过。该错误仍会弹出并使 IIS 崩溃。

我可以做些什么来检查并确保数据集和数据表存在,或者不为空,以便 IIS 不会崩溃?

谢谢!

首先,你应该使用Option Strict On。它将帮助您正确匹配所有类型,从而减少错误并加快代码速度。

现在进入正题。如果您可以对程序 运行 时遇到的问题做一些有用的事情,您应该这样做。这种情况下,如果数据已经丢失,可以重新初始化:

Public Sub New()
    Dim ds As Data.DataSet

    If Session("secureData") Is Nothing Then
        ds = getSecureDS(gameID)
        Session("secureData") = ds
    Else
        ds = DirectCast(Session("secureData"), Data.DataSet)
    End If

    If Not ds.Tables.Contains("GameInfo") Then
        Throw New System.ArgumentException("The secureData must contain [GameInfo] table.")
    End If

    ' more code...

End Sub

另请注意检查特定 table 是否存在的简洁方法,尽管我建议它正确地属于 getSecureDS 方法。

如果数据集适用于站点的 所有 用户,您应该考虑使用 System.Runtime.Caching 而不是会话状态。