在Windows 7(PRO)上的IIS 7.5 .Net Framework 4.0上托管的ASP.Net,ASP.Net MVC和WCF服务的正确默认处理程序映射是什么?
在安装了ASP.Net MVC 3/4的8位开发人员的团队中,只有1名开发人员可以在IIS 7.5中的默认网站下使用基本的ASP.Net MVC 3 Internet应用程序,而无需更改处理程序映射,没有一个团队可以获得具有相同站点的第二个网站,以使用位于根网站的子目录中的站点目录.的Inetpub/wwwroot文件/网站
下面是IIS 7.5中设置的三个处理程序映射,它们都是不同的,并且未被开发人员更改.
将所需设置定义为默认值并确保所有工作站都应用相同配置而不在网站Web.Config文件中设置它们的最佳方法是什么?
我们在.Net 4.0中创建了一个Windows服务,该服务解析由逗号分隔值(几百万行,5-10个值)组成的大文本文件,这里没问题,我们可以读取行,将它们拆分为Key/Value集合并处理这些值.要验证值,我们使用Data Paralellism将值(基本上是特定格式的值数组)传递给对单个值执行RegEx验证的方法.
到目前为止,我们使用静态正则表达式,而不是静态RegEx.IsMatch方法,而是使用RegexOption定义为RegexOptions.Compiled的静态RegEx属性,如下所述.
private static Regex clientIdentityRegEx = new Regex("^[0-9]{4,9}$", RegexOptions.Compiled);
Run Code Online (Sandbox Code Playgroud)
使用这种方法,我们有一个非常标准的内存占用,内存随着每行中更多的值而略有增加,所花费的时间或多或少与行总数成线性关系.
为了允许在不同的Framework版本的其他项目中使用正则表达式,我们最近将静态RegEx属性移动到现在使用.Net 2.0 CLR编译的公共实用程序项目(实际正则表达式未更改),暴露的RegEx属性数量从25个左右增加到大约60个.自从这样做以来,我们已经开始遇到内存问题,内存增加了3倍或者是原始项目的内存.当我们分析正在运行的服务时,我们可以看到内存似乎是从RegEx.IsMatch"泄漏",而不是任何特定的RegEx,但取决于调用的内容.
我在BCL团队的一个与.Net 1.0/1.1 RegEx相关的旧MSDN博客文章中发现了以下评论.
然而,应该提到的编译成本更高.使用Reflection.Emit发送IL会加载大量代码并使用大量内存,而这不是您将要获得的内存.此外.在v1.0和v1.1中,我们无法释放我们生成的IL,这意味着您使用此模式泄露了内存.我们已经在Whidbey修复了这个问题.但最重要的是,您应该只将此模式用于一组有限的表达式,您知道这些表达式将被重复使用.
我将添加我们已经描述了"大多数"常见的RegEx调用,并且无法单独复制该问题.
这是.Net 2.0 CLR的已知问题吗?
在文章中,作者陈述"但最重要的是,你应该只将这种模式用于你知道将重复使用的有限表达式集合",这可能是以这种方式使用的有限数量的表达式,这可能是一个原因吗?
更新:根据@Henk Holterman的答案,除了按体积和参数格式使用纯粹的暴力外,还有基准测试正则表达式的最佳实践,特别是RegEx.IsMatch吗?
答案:汉克斯的答案是"场景调用有限的,固定数量的RegEx对象",我们将静态RegEx'添加到类中,直到我们将内存使用量明显增加的表达式隔离,这些是迁移到单独的静态类,这似乎解决了一些内存问题.
看来,虽然我无法确定这一点,但.Net 2.0 CLR与.Net 4.0 CLR之间的编译RegEx使用之间存在差异,因为当仅仅针对.Net 4.0框架进行编译时不会发生内存问题.(任何确认?)