我是一名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()
感谢
答案 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只在每个页面的页面生命周期中调用一次。我可能会将它放入应用程序缓存并将其用作单例,但获取它的工作可能效率较低 - 让我测试一下......
再次感谢。