Versuch, geschützten Speicher zu lesen oder zu schreiben. Nur bei Verwendung von WCF? Awesomium / HTML Agilitätspaket

awesomium c# html-agility-pack wcf

Frage

Ich habe ein Formular, das Daten von einer Website abschabt, Awesomium als Browser und HTMLAgilityPack verwendet, um HTML zu übergeben, und es an einen anderen Prozess mit WCF sendet.

Wenn ich die Methode ScraperForm.GetData () mit der Schaltfläche auf dem Formular aufrufen, bekomme ich keinen Fehler (der HTML-Code wird richtig vom Javascript erfasst).

Wenn ich es von meinem anderen Formular aus anrufe (mit dem WCF-Client), erhalte ich den folgenden Fehler in meinem 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!
    }
}

Mein WCF Interprozess-Kommunikationscode:

[ServiceContract]
public interface IModelData
{
    [OperationContract]
    ArrayList GetData();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class ModelDataClient
{
    ChannelFactory<IModelData> HttpFactory;
    IModelData HttpProxy;

    public ModelDataClient()
    {
        HttpFactory = new ChannelFactory<IModelData>(
            new BasicHttpBinding(),
            new EndpointAddress("http://localhost:8000/ModelData"));

        HttpProxy = HttpFactory.CreateChannel();
    }

    public ArrayList GetData()
    {
        return HttpProxy.GetData();
    }
}

[ServiceBehavior(UseSynchronizationContext = false, InstanceContextMode = InstanceContextMode.Single)]
public class ModelDataServer : IModelData
{
    public delegate ArrayList GetData();
    public GetData _GetData { get; set; }

    public ModelDataServer()
    {
    }

    public ArrayList GetData()
    {
        return _GetData();   // When called here (Using WCF) it causes the error!
    }
}

Fehler (zeigt auf Html = webControl.ExecuteJavascriptWithResult ("document.documentElement.outerHTML"). ToString ();):

Versuch, geschützten Speicher zu lesen oder zu schreiben. Dies ist oft ein Hinweis darauf, dass anderer Speicher beschädigt ist

Ich denke, das hat etwas damit zu tun, dass ich mein Scraper-Formular so eingestellt habe, dass es als Administrator oder so läuft. Danke für Ihre Hilfe.

Aktualisieren:

Ich folgte den Anweisungen hier: http://jtstroup.net/post/Attempted-to-read-oder-write-protected-memory-This-is-often-an-indication-that-other-memory-is-corrupt. aspx ( Deaktivieren der Datenausführungsverhinderung) und ich erhalte immer noch denselben Fehler.

Ich glaube, das Problem liegt in einem Missverhältnis zwischen Awesomium und dem Rest meines Programms. Etwas mit einer anderen Version von .net oder etwas zu tun.

Ein anderer Vorschlag, den ich fand, war, das ganze Projekt als x86 zu bauen, aber das hat auch nicht funktioniert.

Hat jemand irgendwelche Vorschläge, die ich versuchen kann? Wie kann ich meine .net Zielversion zu der von Awesomium ändern? Ob das funktioniert?

Akzeptierte Antwort

Ich habe das Problem behoben, indem ich den HTML-Code aus dem Webformular mit einem Zeitgeber gezogen habe. Dann ruft mein WCF nur eine Methode auf, die die Daten abfängt, die vom letzten Tick des Timers aktualisiert wurden.

Also, das Problem ist wahrscheinlich, dass die WebCore-Komponente nicht threadsicher ist.

Danke Grobboy!



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow