Рендеринг 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, но разные, один файл, без установки)