我使用HtmlAgilityPack解析达200,000 HTML文档。
我无法预测这些文件的内容,但是这样的一个文件会导致我的申请失败,一个StackOverflowException
。 该文件包含此HTML:
<ol>
<li><li><li><li><li><li>...
</ol>
有大致万<li>
嵌套这样的元件。 由于道路HtmlAgilityPack解析HTML它会导致StackOverflowException
。
不幸的是,StackOverflowException不开捕在.NET 2.0及更高版本。
我也纳闷有关设置一个较大的尺寸为线程的堆栈,但设置一个较大的堆栈大小黑客攻击:它会导致我的程序使用更多的内存(我的程序开始进行处理HTML约50个线程,因此,所有这些线程将有增加的堆栈大小),如果它曾经碰到类似情况再次来到手动将需要调整。
是否有任何其他的解决方法,我可以使用?
我只是打补丁,我认为这是与您的描述错误。 上传补丁到HAP项目网站...
http://www.codeplex.com/site/users/view/sjdirect (见2012/3/8补丁)
还是看这个问题的更多的文档,并导致这里....
https://code.google.com/p/abot/issues/detail?id=77
实际的修复程序......补充可以设置,以防止由吨嵌套标签造成StackOverflowExceptions HtmlDocument.OptionMaxNestedChildNodes。 这将引发与消息的ApplicationException的“文档具有比X嵌套标签了。这可能是由于该网页无法正常关闭的标签。”
如何我使用的是厦门补丁后...
HtmlDocument hapDoc = new HtmlDocument();
hapDoc.OptionMaxNestedChildNodes = 5000;//This is what was added
string rawContent = GETTHECONTENTHERE
try
{
hapDoc.LoadHtml(RawContent);
}
catch (Exception e)
{
//Instead of a stackoverflow exception you should end up here now
hapDoc.LoadHtml("");
_logger.Error(e);
}
理想情况下,长期的解决方案是修补HtmlAgilityPack使用堆栈,而不是调用堆栈,但是这将是一个事业对我来说太大。 我暂时失去我的CodePlex网站帐户的详细信息,但是当我让他们回来,我会在这个问题提交问题报告。 我也注意到这个问题可以提出一个阻断服务攻击漏洞来使用HtmlAgilityPack消毒用户提交HTML的任何站点 - 一个制作过于嵌套的HTML文档将导致W3wp.exe进程死亡。
在此期间,我想前进的最好方式是手动覆盖的最大线程堆栈大小。 我错在我先前说的,一个更大的堆栈尺寸意味着所有的线程会自动消耗内存(似乎内存页面被分配一个线程堆栈,因为它生长,并非所有在一次性)。
我做了副本<ol><li>
页,并进行了一些实验。 我发现我的计划失败时,堆栈大小小于2^21
大小字节,但最大大小2^22
得手-这是4MB,并在我的书通过为“可接受的”黑客...现在。