Рендеринг HTML+Javascript на стороне сервера

мне нужно отобразить серверную часть HTML-страницы и" извлечь " необработанные байты элемента canvas, чтобы я мог сохранить его в PNG. Проблема в том, что элемент canvas создается из javascript (я использую флот jquery для создания диаграммы, в основном). Поэтому я думаю, что мне нужен способ "разместить" функциональность 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. Я не могу использовать какую-либо систему.Окна.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 проходит обычный" неинициализированный"," загрузка"," полный " цикл, ошибок не возникает, ничего.

4 ответов


вы можете рассмотреть возможность использования Watin. Создайте свою страницу, затем используйте API Watin для захвата сгенерированной страницы.

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


нашел Awesomium тут ровно что мне нужно! "Windowless web-browser framework". Бриллиант.


в основном вы пытаетесь делать вещи,которые не предназначены для этого.

вы создаете HTML + Javascript, чтобы браузер мог его рисовать. Вы пишете C#, чтобы включить любые серверные вещи.

создание HTML + Javascript на сервере, чтобы загрузить его в браузер на сервере чтобы иметь возможность сохранять PNG звучит плохо.

вы думали о других подходах, таких как создание изображения с использованием серверного компонента c#? В принципе, почему вам действительно нужно сохранить его на сервере? Может быть, кто-то может предложить лучшее решение?


посмотреть создание HTML Canvas image data server-side? для решения PhantomJs (аналогично Node.js, но разные, один файл, без установки)