Tentativo di leggere o scrivere memoria protetta. Solo quando si usa WCF? Awesomium / HTML Agility Pack

awesomium c# html-agility-pack wcf

Domanda

Ho un modulo che cancella i dati da un sito Web, utilizzando Awesomium come browser e HTMLAgilityPack per passare l'Html e lo invia a un altro processo utilizzando WCF.

Quando chiamo il metodo ScraperForm.GetData () con il pulsante sul modulo non ottengo alcun errore (l'html viene afferrato correttamente dal javascript).

Quando lo chiamo dal mio altro modulo (usando il client WCF) ottengo il seguente errore nel mio 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!
    }
}

Il mio codice di comunicazione Interfocesso WCF:

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

Errore (punta a Html = webControl.ExecuteJavascriptWithResult ("document.documentElement.outerHTML"). ToString ();):

Tentativo di leggere o scrivere memoria protetta. Questo è spesso un'indicazione che un'altra memoria è corrotta

Penso che questo sia qualcosa a che fare con l'impostazione del mio modulo raschietto da eseguire come amministratore o qualcosa del genere. Grazie per l'aiuto.

Aggiornare:

Ho seguito le istruzioni qui: http://jtstroup.net/post/Attempted-to-read-or-write-protected-memory-Questo-è-subito-un-indicazione-che-un'altra-memoria-è-corrotto. aspx (Disattivazione di Execution Prevention) e sto ancora ricevendo lo stesso errore.

Credo che il problema risieda nel mis-match tra Awesomium e il resto del mio programma. Qualcosa che ha a che fare con una versione diversa di .net o qualcosa del genere.

Un altro suggerimento che ho trovato è stato quello di costruire l'intero progetto come x86 ma questo non ha funzionato neanche.

Qualcuno ha qualche suggerimento che posso provare? Come posso cambiare la mia versione .net di destinazione con quella di Awesomium? Funzionerà?

Risposta accettata

Ho risolto il problema estraendo l'HTML dal webform su un timer, quindi il mio WCF chiama semplicemente un metodo che acquisisce i dati che sono stati aggiornati dall'ultimo tick del timer.

Quindi sì, il problema è probabile che il componente WebCore non sia thread-safe.

Grazie Groverboy!



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché