J'ai besoin de rendre un serveur de page HTML et "extraire" les octets bruts d'un élément de toile afin que je puisse le sauvegarder sur un PNG. Le problème est que l'élément Canvas est créé à partir de JavaScript (j'utilise le flot de JQuery pour générer un graphique, fondamentalement). Je suppose donc que j'ai besoin d'un moyen d'"héberger" la fonctionnalité Dom + JavaScript à partir d'un navigateur sans utiliser le navigateur. Je me suis installé sur MSHTML (mais ouvert à toutes les suggestions), car il semble que cela puisse être en mesure de cela. Ceci est un projet ASP.NET MVC.
J'ai cherché loin et je n'ai rien vu de concluance. p>
J'ai donc cet exemple de HTML simple conservé aussi simple que possible de démontrer le problème - p> qui produit la sortie attendue lorsqu'il est exécuté à partir d'un navigateur . P> Je veux pouvoir charger l'original HTML dans la mémoire, exécutez la fonction JavaScript, puis manipulez l'arbre DOM final. Je ne peux pas utiliser de classe System.Windows.webrowser, car mon code doit fonctionner dans un environnement de service. P> Voici mon code: P> 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;
4 Réponses :
Fondamentalement, vous essayez de faire des choses, qui ne sont pas destinées à être faites de cette façon. p>
Vous générez HTML + JavaScript pour activer le navigateur de le dessiner. Vous écrivez C # pour activer tout type de choses côté serveur. P>
générant HTML + JavaScript sur le serveur pour le charger dans un navigateur sur serveur em> pour pouvoir enregistrer des sons PNG Bad. p>
Avez-vous pensé à d'autres approches comme générer l'image à l'aide du composant C # Server C #?
Fondamentalement, pourquoi avez-vous vraiment besoin de l'enregistrer sur le serveur? Peut-être que quelqu'un peut offrir une meilleure solution? P>
Merci d'avoir pris le temps de répondre, mais je vais être en désaccord avec ce que vous avez dit - concernant "non prévu". La zone visuelle d'un navigateur (la fenêtre) devrait être (et est) séparée de son moteur DOM / JavaScript interne. Pourquoi devrait-il compter là où le résultat est rendu? Pourquoi le Dom + CSS + CSS + JavaScript n'est-il pas rendu dans n'importe quel endroit en mémoire? En fait, il y a un exemple de nœud.js interagissant avec FLOT pour faire exactement ce que je veux faire - générer un serveur de carte. Malheureusement, je ne peux pas utiliser nœud.js ...
En ce qui concerne ce que je dois faire sur le serveur - j'ai besoin de produire périodiquement un graphique (pour l'instant, à l'aide de FLOT) dans un environnement sans tête et non interactif. Le graphique doit ressembler exactement la même chose que si un utilisateur affichait la page Web dans un navigateur. Il s'agit d'un projet ASP.NET MVC, je n'ai pas trouvé de commandes / composants côté serveur pour le faire facilement.
Ouais, fondamentalement, tu as raison. Il est vraiment logique de rendre Dom + CSS + JavaScript n'importe où dans la mémoire. Cependant, je m'attendrais à ce que cela fonctionne avec un navigateur, qui ne peut pas être chargé en session non interactive. Quoi qu'il en soit, je vous souhaite bonne chance si vous procédez à cela.
Vous pouvez envisager d'utiliser WATIN. Générez votre page, utilisez API Watin pour capturer la page générée. P>
http://fwdnug.com/ Blogs / DDODGEN / Archive / 2008/06/19 / WATIN-API-CAPTUREWEBPAGETOFILE.ASPX P>
J'ai essayé Watin. C'est bien, mais il semble s'agir d'une enveloppe autour d'IE / Firefox et de les lance réellement, comme dans un processus séparé + la fenêtre. Donc, pas de bien dans un environnement sans tête et non interactif.
J'ai trouvé Awesomium fait em> ce dont j'ai besoin! «Cadre de navigateur Web sans fenêtre». Brillant. p>