渲染HTML + Javascript服务器端

Dim*_*kov 6 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>
Run Code Online (Sandbox Code Playgroud)

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

我希望能够将原始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;
Run Code Online (Sandbox Code Playgroud)

问题是,"beforeScript"和"afterScript"完全相同.IHTMLDocument2实例经历了正常的"未初始化","加载","完成"循环,没有抛出任何错误,没有任何错误.

对于我做错了什么,有人有任何想法吗?完全迷失在这里.

Dim*_*kov 1

我发现Awesomium正是我所需要!“无窗口网络浏览器框架”。杰出的。