簡體   English   中英

呈現HTML + Javascript服務器端

[英]Rendering HTML+Javascript server-side

我需要在服務器端呈現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>

從瀏覽器運行時會產生預期的輸出。

我希望能夠將原始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

我發現Awesomium正是我所需要的! “無窗口Web瀏覽器框架”。 輝煌。

請參閱在服務器端生成HTML Canvas圖像數據? 用於PhantomJs解決方案(類似於Node.js,但不同,單個文件,無需安裝)

基本上,您正在嘗試做一些事情,而這些事情並非打算那樣做。

您生成HTML + Javascript,以使瀏覽器可以繪制它。 您編寫C#來啟用任何類型的服務器端功能。

在服務器上生成HTML + Javascript以將其加載到服務器上的瀏覽器中以便能夠保存PNG聽起來很糟糕。

您是否考慮過其他方法,例如使用服務器端C#組件生成圖像? 基本上,您為什么真正需要將其保存在服務器上? 也許有人可以提供更好的解決方案?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM