2011-12-05 15 views
6

प्रस्तुत करने के लिए मुझे एक HTML पृष्ठ सर्वर-साइड प्रस्तुत करना होगा और कैनवास तत्व के कच्चे बाइट्स को "निकालें" ताकि मैं इसे पीएनजी में सहेज सकूं। समस्या यह है कि कैनवास तत्व जावास्क्रिप्ट से बनाया गया है (मूल रूप से चार्ट उत्पन्न करने के लिए मैं jquery के फ़्लोट का उपयोग कर रहा हूं)। तो मुझे लगता है कि मुझे वास्तव में ब्राउज़र का उपयोग किए बिना ब्राउज़र से DOM + जावास्क्रिप्ट कार्यक्षमता "होस्ट" करने का एक तरीका चाहिए। मैं mshtml पर बस गया (लेकिन किसी भी और सभी सुझावों के लिए खुला) क्योंकि ऐसा लगता है कि यह वास्तव में ऐसा करने में सक्षम होना चाहिए। यह एक एएसपी.नेट एमवीसी परियोजना है।एचटीएमएल + जावास्क्रिप्ट सर्वर-साइड

मैंने दूर और व्यापक खोज की है और कुछ भी निर्णायक नहीं देखा है।

तो मैं इस साधारण 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 को स्मृति में लोड करने, जावास्क्रिप्ट फ़ंक्शन निष्पादित करने में सक्षम होना चाहता हूं, फिर अंतिम डोम पेड़ में हेरफेर करना चाहता हूं। मैं किसी भी 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 उदाहरण सामान्य "अनियमित", "लोडिंग", "पूर्ण" चक्र के माध्यम से जाता है, कोई त्रुटि नहीं फेंक दी जाती है, कुछ भी नहीं।

किसी के पास कोई भी विचार है जो मैं गलत कर रहा हूं? पूरी तरह से यहाँ खो दिया।

उत्तर

1

मैंने पाया Awesomium मैं क्या जरूरत है बिल्कुल करता है! "विंडोलेस वेब ब्राउजर फ्रेमवर्क"। प्रतिभाशाली। के बारे में "इरादा नहीं -

1

असल में आप चीजों को करने की कोशिश कर रहे हैं, जो इस तरह से किए जाने का इरादा नहीं है।

ब्राउज़र को आकर्षित करने के लिए आप HTML + जावास्क्रिप्ट उत्पन्न करते हैं। आप किसी भी प्रकार की सर्वर साइड चीजों को सक्षम करने के लिए सी # लिखते हैं।

पीएनजी ध्वनियों को खराब करने में सक्षम होने के लिए सर्वर पर ब्राउज़र पर इसे लोड करने के लिए सर्वर पर HTML + जावास्क्रिप्ट उत्पन्न करना।

क्या आपने सर्वर पक्ष सी # घटक का उपयोग कर छवि उत्पन्न करने जैसे अन्य दृष्टिकोणों के बारे में सोचा था? असल में, आपको इसे सर्वर पर सहेजने की ज़रूरत क्यों है? शायद कोई बेहतर समाधान प्रदान कर सकता है?

+0

धन्यवाद, लेकिन मैं तुम क्या कहा से असहमत होगा "। एक ब्राउज़र का देखने योग्य क्षेत्र (विंडो) होना चाहिए (और है) अपने आंतरिक डोम/जावास्क्रिप्ट इंजन से अलग होना चाहिए। यह क्यों मायने रखता है कि परिणाम कहां प्रदान किया जाता है? स्मृति में किसी भी स्थान पर डोम + सीएसएस + जावास्क्रिप्ट क्यों नहीं दिया जा सकता है? असल में, फ्लोड के साथ इंटरैक्ट करने वाले नोड.जेएस का एक उदाहरण है जो मैं करना चाहता हूं - एक चार्ट सर्वर-साइड उत्पन्न करता है। अफसोस की बात है, मैं नोड.जेएस का उपयोग नहीं कर सकता ... –

+0

मुझे सर्वर पर क्या करने की आवश्यकता है इसके बारे में - मुझे एक समयहीन, गैर-इंटरैक्टिव वातावरण में एक चार्ट (अब, फ्लोट का उपयोग करके) का उत्पादन करना होगा। चार्ट को वही दिखना होगा जैसा कि कोई उपयोगकर्ता ब्राउज़र में वेब पेज देख रहा था। यह एक एएसपी.नेट एमवीसी प्रोजेक्ट है, मुझे इसे आसानी से करने के लिए कोई सर्वर-साइड नियंत्रण/घटक नहीं मिला है। –

+0

हाँ, मूल रूप से आप सही हैं। यह वास्तव में स्मृति में कहीं भी डीओएम + सीएसएस + जावास्क्रिप्ट प्रस्तुत करने के लिए समझ में आता है। हालांकि, मैं उम्मीद करता हूं कि यह ब्राउज़र के साथ काम करे, जिसे गैर-इंटरैक्टिव सत्र में लोड नहीं किया जा सकता है। वैसे भी, मैं आपको शुभकामनाएं देता हूं, अगर आप इसके साथ आगे बढ़ेंगे। –

1

आप वाटिन का उपयोग करने पर विचार कर सकते हैं। जेनरेट पेज को कैप्चर करने के लिए अपना पेज जेनरेट करें, फिर वाटिन एपीआई का उपयोग करें।

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

+0

मैंने वाटिन की कोशिश की। यह अच्छा है, लेकिन ऐसा लगता है कि यह आईई/फ़ायरफ़ॉक्स के आसपास सिर्फ एक रैपर है और वास्तव में उन्हें एक अलग प्रक्रिया + विंडो में लॉन्च करता है। तो, एक मुखर, गैर-संवादात्मक वातावरण में कोई अच्छा नहीं है। –

0

एक PhantomJs समाधान के लिए Generating HTML Canvas image data server-side? देखें (Node.js के समान है, लेकिन अलग, एकल फाइल, नहीं स्थापित) जवाब देने के लिए समय निकालने के लिए

संबंधित मुद्दे