当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

asp.net-长时间正常运行后出现nullreferenceexception

admin 78℃
我有一个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的是referral类的实例(它有多个构造函数,都很简单)。

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

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

请求子域具有合理的复杂性,因此我怀疑它是从堆栈跟踪中被内联和移除的。上面是:

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

如能提供任何帮助或建议,以获取更多信息,我们将不胜感激。很明显(因为有很多问题)只在生产中发生,所以我不想打开调试。

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

  • 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 

结果发现,arraylist中有一个空值-在某些情况下,多个线程正在处理同一个对象(它继承自arraylist)并调用add()。因此出现空值是因为内部索引被不同的线程递增了两次。

转载请注明:我的代码 » asp.net-长时间正常运行后出现nullreferenceexception