javascript - 呈现 HTML+Javascript 服务器端

标签 javascript asp.net-mvc dom mshtml

我需要在服务器端呈现 HTML 页面并“提取” Canvas 元素的原始字节,以便将其保存为 PNG。问题是,canvas 元素是从 javascript 创建的(我基本上是使用 jquery 的 Flot 生成图表)。所以我想我需要一种方法来从浏览器“托管”DOM+Javascript 功能,而无需实际使用浏览器。我选择了 mshtml(但对任何和所有建议持开放态度),因为它似乎应该能够做到这一点。这是一个 ASP.NET MVC 项目。

我已经进行了广泛的搜索,但没有看到任何结论。

所以我有这个简单的 HTML - 示例尽可能简单来演示问题 -

<!DOCTYPE html>
<html>
<head>
    <title>Wow</title>
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js" type="text/javascript"></script>
</head>
<body>
    <div id="hello">
    </div>
    <script type="text/javascript">
        function simple() 
        {
            $("#hello").append("<p>Hello</p>");
        }                    
    </script>
</body>
</html>

从浏览器运行时产生预期的输出。

我希望能够将原始 HTML 加载到内存中,执行 javascript 函数,然后操作最终的 DOM 树。我不能使用任何类似 System.Windows.WebBrowser 的类,因为我的代码需要在服务环境中运行。

这是我的代码:

IHTMLDocument2 domRoot = (IHTMLDocument2)new HTMLDocument();

        using (WebClient wc = new WebClient())
        {
            using (var stream = new StreamReader(wc.OpenRead((string)url)))
            {
                string html = stream.ReadToEnd();
                domRoot.write(html);
                domRoot.close();
            }
        }

        while (domRoot.readyState != "complete")
            Thread.Sleep(SleepTime);

        string beforeScript = domRoot.body.outerHTML;

        IHTMLWindow2 parentWin = domRoot.parentWindow;            
        parentWin.execScript("simple");

        while (domRoot.readyState != "complete")
            Thread.Sleep(SleepTime);


        string afterScript = domRoot.body.outerHTML;

        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(domRoot);
        domRoot = null;

问题是,“beforeScript”和“afterScript”完全一样。 IHTMLDocument2 实例经历正常的“未初始化”、“加载”、“完成”循环,没有抛出任何错误,什么也没有。

有人知道我做错了什么吗?完全迷失在这里。

最佳答案

可以考虑使用Watin。生成您的页面,然后使用 Watin api 捕获生成的页面。

http://fwdnug.com/blogs/ddodgen/archive/2008/06/19/watin-api-capturewebpagetofile.aspx

关于javascript - 呈现 HTML+Javascript 服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8391133/

相关文章:

c# - IPN 验证不会在应该失败的时候失败

html - 如何使用 Web::Scraper 解析此 HTML?

javascript - DOM 操作的最佳工具?

javascript - 什么类型可以让控制代码通过 Javascript 中的 Blob() API?

javascript - 单击按钮时面包屑菜单会更新吗?

javascript - 在迭代期间在每个容器中复制图像

c# - 更新 ASP .Net MVC 中的记录

javascript - 将 props 传递给 Children of Children(嵌套组件树)

c# - 对象有关系时使用LINQ to SQL添加记录有什么秘诀吗?

javascript - 克隆节点不等于原始节点(使用 isEqualNode)