具有较大 html 数据的 MVC StackOverflowException

MVC StackOverflowException with larger html data

我有以下方法(我正在使用 htmlagilitypack):

public DataTable tableIntoTable(HtmlDocument doc)
    {
        var nodes = doc.DocumentNode.SelectNodes("//table");
        var table = new DataTable("MyTable");
        table.Columns.Add("raw", typeof(string));                       

        foreach (var node in nodes)
        {
            if (
                (!node.InnerHtml.Contains("pldefault"))
                && (!node.InnerHtml.Contains("ntdefault"))
                && (!node.InnerHtml.Contains("bgtabon"))                
                )
            {
                table.Rows.Add(node.InnerHtml);
            }
        }
        return table;
    }

它接受 html 使用此抓取:

 public HtmlDocument getDataWithGet(string url)
    {
        using (var wb = new WebClient())
        {
            string response = wb.DownloadString(url);
            var doc = new HtmlDocument();
            doc.LoadHtml(response);
            return doc;
        }
    }

对于 3294 行长的 html 文档,一切正常。
当我给它一些 html 时,它有 33960 行长,我得到: WhosebugException 在 tableIntoTable 方法中的 IF 语句处未处理,如下图所示: http://imgur.com/Q2FnIgb

我认为这可能与 MaxHttpCollectionKeys 限制为 1000 有关,所以我尝试将其放入我的 Web.config 但它仍然不起作用: 添加 key="aspnet:MaxHttpCollectionKeys" value="9999"

我不太确定从这里到哪里去,只有更大的 html 文档才会中断。

假设您的 if 语句中的值包含在 table 的某些后代的某些属性值中。

var xpath = @"//table[not(.//*[contains(@*,'pldefault') or
                               contains(@*,'ntdefault') or 
                               contains(@*,'bgtabon')])]";

var tables = doc.DocumentNode.SelectNodes(xpath);

更新: 根据您的评论更准确:

        @"//table[not(.//td[contains(@class,'pldefault') or
                            contains(@class,'ntdefault') or 
                            contains(@class,'bgtabon')])]";