抛出了System.OutOfMemoryException。在Go60505(RegexRunner)的System.Text.RegularExpressions.CompiledRegexRunner.Go()

时间:2010-04-12 16:07:09

标签: c# .net vb.net

我是一名c#dev,正在为vb.net中的某个网站编写代码。我们在32位iss 6 win 2003框中使用了大量缓存,在某些情况下会遇到OutOfMemoryException异常。这是我追溯到的代码,想知道其他人是否有这个......

Public Sub CreateQueryStringNodes()
    'Check for nonstandard characters'
    Dim key As String
    Dim keyReplaceSpaces As String
    Dim r As New Regex("^[-a-zA-Z0-9_]+$", RegexOptions.Compiled)

    For Each key In HttpContext.Current.Request.Form
        If Not IsNothing(key) Then
            keyReplaceSpaces = key.Replace(" ", "_")
            If r.IsMatch(keyReplaceSpaces) Then
                CreateNode(keyReplaceSpaces, HttpContext.Current.Request(key))
            End If
        End If
    Next

    For Each key In HttpContext.Current.Request.QueryString
        If Not IsNothing(key) Then
            keyReplaceSpaces = key.Replace(" ", "_")

            If r.IsMatch(keyReplaceSpaces) Then
                CreateNode(keyReplaceSpaces, HttpContext.Current.Request(key).Replace("--", "-"))
            End If
        End If
    Next
End Sub

.NET Framework版本:2.0.50727.3053; ASP.NET版本:2.0.50727.3053

错误:

  

抛出了类型'System.OutOfMemoryException'的异常。在   Go60505(RegexRunner)在   System.Text.RegularExpressions.CompiledRegexRunner.Go()at   System.Text.RegularExpressions.RegexRunner.Scan(正则表达式正则表达式,字符串   text,Int32 textbeg,Int32 textend,Int32 textstart,Int32 prevlen,   System.Text.RegularExpressions.Regex.Run(布尔值)   quick,Int32 prevlen,字符串输入,Int32开头,Int32长度,   Int32 startat)在System.Text.RegularExpressions.Regex.IsMatch(String   输入)在Xcite.Core.XML.Write.CreateQueryStringNodes()at   Xcite.Core.XML.Write..ctor(String IncludeSessionAndPostedData)at   mysite._Default.Page_Load(Object sender,EventArgs e)at   System.Web.UI.Control.OnLoad(EventArgs e)at   

的System.Web.UI.Control.LoadRecursive()

感谢

3 个答案:

答案 0 :(得分:1)

couple articles there {{3}}几乎可以说避免使用Compiled,这并不意味着人们认为它有时意味着什么。如果我理解正确,使用Compiled实际上会在应用程序持续时间内永久占用内存。由于您在网络上,应用程序的生命周期可能相当长。这应该在2.0框架中修复/解决,但看起来没有。

答案 1 :(得分:0)

因此,一旦代码用'_'替换所有空格,它就匹配它们?这是用带破折号或下划线的alpanumeric的某种验证吗?

正则表达式解析器正在处理多少数据?

请注意您的模式(现在)可以更改为

^ [\瓦特-_] + $

(注意你使用Regex Compiled非常适合这种情况,不像其他帖子所说的那样。)

要了解有关编译检出的信息要真正了解正在进行的操作,请参阅正则表达式编译部分中的Base Class Library Performance Tips and Tricks。 HTH

答案 2 :(得分:0)

谢谢!让我明天在办公室检查一些事情,我可以尝试两种解决方案的组合 - 我会写一些测试并让你知道。正则表达式解析器作用于一个长字符串,创建节点填充一个列表对象,稍后使用像xml for xslt转换为html输出,我们在最终输出上使用响应输出缓存。 我不认为静态变量会产生影响,因为这是一个asp.net应用程序,CreateQueryStringNodes只在每个页面的页面生命周期中调用一次。我可能会将它放入应用程序缓存并将其用作单例,但获取它的工作可能效率较低 - 让我测试一下......

再次感谢。