代码之家  ›  专栏  ›  技术社区  ›  Damien_The_Unbeliever

长时间运行后发生NullReferenceException

  •  2
  • Damien_The_Unbeliever  · 技术社区  · 14 年前

    我有一个ASP.NET应用程序,在长时间运行之后,它开始抛出NullReferenceExceptions。所讨论的代码在每个单独会话的早期使用,我们试图在其中建立某种引用者信息。问题是,我不知道什么可以抛出这个例外。

    所讨论的方法(堆栈跟踪中的最顶层)是:

    Private Function ResolveReferrer(ByVal wrRequest As HttpRequest) As Referral
    
      '1) If we don't find a domain, try and get a match on any query strings
      If wrRequest.QueryString.Count > 0 Then
        For Each item As Referral In Me
          For Each sKey As String In wrRequest.QueryString.Keys
            If Not sKey Is Nothing AndAlso item.Names.Contains(sKey.ToLower) Then
              Return item
            End If
          Next sKey
        Next item
      End If
    
    
      Dim strSubDomain As String = Utility.RequestSubDomain(wrRequest.Url)
      '2) If we don't find one on the domain, see if we can find the domain in query string
      If Not wrRequest.QueryString.Item("domain") Is Nothing Then
        strSubDomain = wrRequest.QueryString.Item("domain")
    
        strSubDomain = HttpUtility.UrlDecode(strSubDomain)
    
        ' OK found a "domain" query string, so make up a referrer object to return
        ' ... just use the domain we've found for all the parameters
        Dim oRef As New Referral(strSubDomain, strSubDomain, strSubDomain)
        Return oref
      End If
    
    
      '3) If no query string of "domain", then see if the referring field is presented by the browser
      If Not wrRequest.UrlReferrer Is Nothing Then
        Dim sURL As String = wrRequest.UrlReferrer.ToString
        strSubDomain = Utility.RequestSubDomain(wrRequest.UrlReferrer)
    
        Dim oRef As New Referral(sURL, sURL, strSubDomain)
        Return oRef
      End If
    
    
      '4) See if we can find the domain defined in the web.config
      For Each item As Referral In Me
    
        ' See if we can find a referrer from the domain name
        If String.Compare(strSubDomain, item.FromDomain, False) = 0 Then
          Return item
        End If
    
      Next item
    
    
      '5) If we still can't find one, make one up with a value of "Unknown"
      Return New Referral("Unknown", "Unknown", "Unknown", "Unknown")
    End Function
    

    这是继承自ArrayList的一部分的类。我已经检查过了,添加到这个arraylist中的只有引用类的实例(它有多个构造函数,都很简单)。

    我们所知道的是,我们可以有一个没有引用信息的请求,它会导致抛出异常。同时,如果一个有推荐人的请求出现,它就可以正常工作。在这两种情况下,查询字符串中都没有传递任何内容(所以我认为您可以跳到'3注释)。

    所以,我的问题是,这个方法中的什么可以导致抛出NullReferenceException?如果您需要添加额外的代码片段或类定义,只需大喊。

    utility.requestSubDomain具有合理的复杂性,因此我怀疑它是否被内联并从堆栈跟踪中删除。最重要的是:

    Public Shared Function RequestSubDomain(ByVal uri As System.Uri) As String
        If uri Is Nothing Then
            Return ""
        End If
    

    如有任何帮助或建议,寻求更多信息将不胜感激。它是 明显地 (和许多问题一样)只在生产中发生,所以我不想打开调试。

    2 回复  |  直到 12 年前
        1
  •  2
  •   Brian Gideon    14 年前

    我仔细看了一眼,想到的两件事似乎最有可能是:

    • wrRequest 可以是空的。
    • 这个 ArrayList 可能包含空值,从而导致枚举器返回空值。

    如果是我,我会首先把注意力集中在这一部分。有没有可能 Me.GetEnumerator 将返回一个枚举器,其中一个项的值为空?

    For Each item As Referral In Me 
      item.Names ' Can item be null here causing the exception on the getter of Names?
    Next item 
    
        2
  •  0
  •   Damien_The_Unbeliever    14 年前

    事实证明,arraylist中有一个空值-事实证明,在某些情况下,多个线程正在同一对象(继承自arraylist)上工作,并调用add()。因此出现了空值,因为内部索引被不同的线程增加了两次。