Tentative de lecture ou d'écriture de la mémoire protégée. Seulement en utilisant WCF? Awesomium / Pack d'agilité HTML

awesomium c# html-agility-pack wcf

Question

J'ai un formulaire qui extrait les données d'un site Web, en utilisant Awesomium comme navigateur et HTMLAgilityPack pour transmettre le code HTML, et l'envoie à un autre processus en utilisant WCF.

Lorsque j'appelle la méthode ScraperForm.GetData () avec le bouton du formulaire, je ne reçois aucune erreur (le code HTML est correctement saisi par le javascript).

Lorsque je l'appelle depuis mon autre formulaire (à l'aide du client WCF), l'erreur suivante s'affiche dans mon ScraperForm:

public partial class ScraperForm : Form
{
    public string Html;
    public HtmlAgilityPack.HtmlDocument HtmlDoc;

    ServiceHost Host;
    ModelDataServer DataServer;

    public ScraperForm()
    {
        InitializeComponent();

        #region Start Data Server
        DataServer = new ModelDataServer();
        DataServer._GetData = new ModelDataServer.GetData(this.GetData);

        Host = new ServiceHost(DataServer, new Uri[]
            {
                new Uri("http://localhost:8000")
            });

        Host.AddServiceEndpoint(typeof(IModelData),
            new BasicHttpBinding(),
            "ModelData");

        Host.Open();

        #endregion

        HtmlDoc = new HtmlAgilityPack.HtmlDocument();
        Html = "";
    }

    private void CloseSever()
    {
        Host.Close();
    }

    public ArrayList GetData()
    {
        #region HTMLScrape - HTML Agility Pack

        // navigate to website
        ArrayList ret = new ArrayList();
        Html = webControl.ExecuteJavascriptWithResult("document.documentElement.outerHTML").ToString();
        // *********** Breaks on the line above this! ***********

    // Grab data out from html, add to ret (ArrayList) 

    return ret;        
    }

    private void button1_Click(object sender, EventArgs e)
    {
        GetData();   // Causes No Errors!
    }
}

Mon code de communication WCF Interprocess:

public partial class ScraperForm : Form
{
    public string Html;
    public HtmlAgilityPack.HtmlDocument HtmlDoc;

    ServiceHost Host;
    ModelDataServer DataServer;

    public ScraperForm()
    {
        InitializeComponent();

        #region Start Data Server
        DataServer = new ModelDataServer();
        DataServer._GetData = new ModelDataServer.GetData(this.GetData);

        Host = new ServiceHost(DataServer, new Uri[]
            {
                new Uri("http://localhost:8000")
            });

        Host.AddServiceEndpoint(typeof(IModelData),
            new BasicHttpBinding(),
            "ModelData");

        Host.Open();

        #endregion

        HtmlDoc = new HtmlAgilityPack.HtmlDocument();
        Html = "";
    }

    private void CloseSever()
    {
        Host.Close();
    }

    public ArrayList GetData()
    {
        #region HTMLScrape - HTML Agility Pack

        // navigate to website
        ArrayList ret = new ArrayList();
        Html = webControl.ExecuteJavascriptWithResult("document.documentElement.outerHTML").ToString();
        // *********** Breaks on the line above this! ***********

    // Grab data out from html, add to ret (ArrayList) 

    return ret;        
    }

    private void button1_Click(object sender, EventArgs e)
    {
        GetData();   // Causes No Errors!
    }
}

Error (pointe vers Html = webControl.ExecuteJavascriptWithResult ("document.documentElement.outerHTML"). ToString ();):

Tentative de lecture ou d'écriture de la mémoire protégée. C'est souvent une indication que d'autres mémoires sont corrompues

Je pense que cela a quelque chose à voir avec le fait de configurer mon formulaire de racleur pour qu'il s'exécute en tant qu'administrateur. Merci de votre aide.

Mettre à jour:

J'ai suivi les instructions ici: http://jtstroup.net/post/Attempted-to-read-or-write-protected-memory-This-is-often-indication-that-other-memory-is-corrupt. aspx (Désactivation de la prévention de l'exécution des données) et je reçois toujours la même erreur.

Je crois que le problème réside dans un décalage entre Awesomium et le reste de mon programme. Quelque chose à faire avec une version différente de .net ou quelque chose.

Une autre suggestion que j'ai trouvée était de construire le projet entier en x86, mais cela n'a pas fonctionné non plus.

Quelqu'un a-t-il des suggestions à essayer? Comment puis-je changer ma version .net cible à celle d'Awesomium? Est-ce que ça va marcher?

Réponse acceptée

J'ai résolu le problème en extrayant le code HTML du formulaire Web sur un minuteur, puis mon WCF appelle simplement une méthode qui récupère les données mises à jour à partir du dernier tick du minuteur.

Donc oui, le problème est probablement que le composant WebCore n'est pas thread-safe.

Merci groverboy!




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi