2011-12-05 44 views
6

Tôi cần hiển thị một trang HTML phía máy chủ và "trích xuất" các byte thô của phần tử canvas để tôi có thể lưu nó vào PNG. Vấn đề là, phần tử canvas được tạo ra từ javascript (tôi đang sử dụng Flot của jquery để tạo ra một biểu đồ, về cơ bản). Vì vậy, tôi đoán tôi cần một cách để "lưu trữ" chức năng DOM + Javascript từ trình duyệt mà không thực sự sử dụng trình duyệt. Tôi định cư trên mshtml (nhưng mở cho bất kỳ và tất cả các gợi ý) vì có vẻ như nó sẽ có thể chính xác điều đó. Đây là một dự án ASP.NET MVC.Hiển thị HTML + Javascript phía máy chủ

Tôi đã tìm kiếm xa và rộng và chưa thấy bất kỳ điều gì kết luận.

Vì vậy, tôi có HTML đơn giản này - ví dụ như giữ đơn giản càng tốt để chứng minh vấn đề -

<!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> 

trong đó sản xuất sản lượng dự kiến ​​khi chạy từ trình duyệt.

Tôi muốn có thể tải HTML gốc vào bộ nhớ, thực thi hàm javascript, sau đó thao tác cây DOM cuối cùng. Tôi không thể sử dụng bất kỳ lớp System.Windows.WebBrowser giống như mã của tôi cần chạy trong một môi trường dịch vụ.

Vì vậy, đây là mã của tôi:

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; 

Vấn đề là, "beforeScript" và "afterScript" là giống hệt nhau. Ví dụ IHTMLDocument2 đi qua chu trình "uninitialized", "loading", "complete" bình thường, không có lỗi nào được ném ra, không có gì.

Bất kỳ ai có bất kỳ ý tưởng nào về những gì tôi đang làm sai? Hoàn toàn bị mất ở đây.

Trả lời

1

tôi thấy Awesomium Liệu chính xác những gì tôi cần! "Khung trình duyệt web không cửa sổ". Rực rỡ.

1

Về cơ bản, bạn đang cố gắng thực hiện những việc không được thực hiện theo cách đó.

Bạn tạo HTML + Javascript để cho phép trình duyệt vẽ nó. Bạn viết C# để kích hoạt bất kỳ loại điều phía máy chủ nào.

Tạo HTML + Javascript trên máy chủ để tải nó vào trình duyệt trên máy chủ để có thể lưu âm thanh PNG xấu.

Bạn có nghĩ về các cách tiếp cận khác như tạo hình ảnh bằng cách sử dụng thành phần C# phía máy chủ không? Về cơ bản, tại sao bạn thực sự cần lưu nó trên máy chủ? Có lẽ ai đó có thể cung cấp giải pháp tốt hơn?

+0

Cảm ơn đã dành thời gian để trả lời, nhưng tôi sẽ không đồng ý với những gì bạn nói - liên quan đến "không có ý định ". Khu vực có thể xem của trình duyệt (cửa sổ) phải là (và) tách biệt với công cụ DOM/Javascript bên trong của trình duyệt. Tại sao nó lại quan trọng khi kết quả được hiển thị? Tại sao DOM + CSS + Javascript không thể hiển thị ở bất kỳ vị trí nào trong bộ nhớ? Trong thực tế, có một ví dụ về Node.js tương tác với Flot để làm chính xác những gì tôi muốn làm - tạo ra một biểu đồ phía máy chủ. Đáng buồn thay, tôi không thể sử dụng Node.js ... –

+0

Về những gì tôi cần làm trên máy chủ - tôi cần, định kỳ, tạo biểu đồ (hiện tại, sử dụng Flot) trong môi trường không đầu, không tương tác. Biểu đồ phải giống y hệt như khi người dùng đang xem trang web trong trình duyệt. Đây là một dự án ASP.NET MVC, tôi đã không tìm thấy bất kỳ điều khiển phía máy chủ/thành phần để làm điều này một cách dễ dàng. –

+0

Vâng, về cơ bản bạn đã đúng. Nó thực sự làm cho tinh thần để làm cho DOM + CSS + Javascript bất cứ nơi nào vào bộ nhớ. Tuy nhiên, tôi hy vọng điều này sẽ hoạt động với trình duyệt, không thể tải được trong phiên không tương tác. Dù sao, tôi chúc bạn may mắn, nếu bạn sẽ tiếp tục với điều này. –

1

Bạn có thể xem xét sử dụng Watin. Tạo trang của bạn, sau đó sử dụng Watin api để nắm bắt trang được tạo.

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

+0

Tôi đã thử Watin. Nó đẹp, nhưng nó có vẻ chỉ là một trình bao bọc xung quanh IE/Firefox và thực sự khởi chạy chúng, như trong một cửa sổ + tiến trình riêng biệt. Vì vậy, không tốt trong một môi trường không đầu, không tương tác. –

Các vấn đề liên quan