呈现HTML+;Javascript服务器端

呈现HTML+;Javascript服务器端,javascript,asp.net-mvc,dom,mshtml,Javascript,Asp.net Mvc,Dom,Mshtml,我需要呈现一个HTML页面服务器端并“提取”画布元素的原始字节,以便将其保存到PNG。问题是,canvas元素是从javascript创建的(基本上,我使用jquery的Flot生成一个图表)。因此,我想我需要一种方法来从浏览器“托管”DOM+Javascript功能,而不必实际使用浏览器。我选择了mshtml(但对任何和所有的建议都持开放态度),因为它似乎应该能够做到这一点。这是一个ASP.NET MVC项目 我到处找了,没有看到任何结论 因此,我将这个简单的HTML示例保持尽可能简单,以演示

我需要呈现一个HTML页面服务器端并“提取”画布元素的原始字节,以便将其保存到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>
问题是,“beforeScript”和“afterScript”完全相同。IHTMLDocument2实例经历了正常的“未初始化”、“加载”、“完成”周期,没有抛出错误,什么都没有


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

基本上,你是在尝试做一些事情,而这些事情并不是以那种方式来做的

生成HTML+Javascript以使浏览器能够绘制它。 您可以编写C#来启用任何类型的服务器端功能

在服务器上生成HTML+Javascript,将其加载到服务器上的浏览器中,以便能够保存PNG,听起来很糟糕

您是否考虑过其他方法,如使用服务器端C#组件生成映像?
基本上,为什么您真的需要将其保存在服务器上?也许有人能提供更好的解决方案?

< P>你可以考虑使用WATIN。生成页面,然后使用Watin api捕获生成的页面


我发现它正是我所需要的!“无窗口web浏览器框架”。太棒了

请参阅PhantomJs解决方案(类似于Node.js,但不同,单文件,无需安装)

感谢您花时间回复,但我不同意您所说的“无意”。浏览器的可视区域(窗口)应该(并且是)与其内部DOM/Javascript引擎分开。为什么结果在哪里呈现很重要?为什么DOM+CSS+Javascript不能在内存中的任何位置呈现?事实上,这里有一个Node.js与Flot交互的例子,它正好完成了我想要做的事情——在服务器端生成一个图表。遗憾的是,我不能使用Node.js…关于我需要在服务器上做什么,我需要在一个无头、非交互的环境中定期生成一个图表(目前使用Flot)。图表的外观必须与用户在浏览器中查看网页时的外观完全相同。这是一个ASP.NETMVC项目,我还没有找到任何服务器端控件/组件来轻松完成这项工作。是的,基本上你是对的。将DOM+CSS+Javascript呈现到内存中的任何位置都是有意义的。但是,我希望它能与浏览器一起工作,而浏览器不能在非交互式会话中加载。不管怎样,我祝你好运,如果你能继续这样做的话。我试过Watin。这很好,但它似乎只是IE/Firefox的包装,实际上是在一个单独的process+窗口中启动它们。所以,在一个无头的、非交互的环境中没有好处。
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;