Intento de leer o escribir en la memoria protegida. Sólo cuando se usa WCF? Awesomium / HTML Agility Pack

awesomium c# html-agility-pack wcf

Pregunta

Tengo un formulario que raspa los datos de un sitio web, utiliza Awesomium como navegador y HTMLAgilityPack para pasar el Html y lo envía a otro proceso mediante WCF.

Cuando llamo al método ScraperForm.GetData () con el botón en el formulario, no obtengo ningún error (el javascript agarra correctamente el html).

Cuando lo llamo desde mi otro formulario (usando el cliente WCF), obtengo el siguiente error en mi 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!
    }
}

Mi código de comunicación WCF Interprocess:

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

Error (apunta a Html = webControl.ExecuteJavascriptWithResult ("document.documentElement.outerHTML"). ToString ();):

Intento de leer o escribir en la memoria protegida. Esto es a menudo una indicación de que otra memoria está dañada

Creo que esto es algo que ver con configurar mi forma de raspador para que se ejecute como administrador o algo así. Gracias por tu ayuda.

Actualizar:

Seguí las instrucciones aquí: http://jtstroup.net/post/Attempted-to-read-or-write-protected-memory-This-is-often-an-indication-that-other-memory-is-corrupt. aspx (Desactivando la Prevención de Ejecución de Datos) y sigo recibiendo el mismo error.

Creo que el problema radica en una falta de coincidencia entre Awesomium y el resto de mi programa. Algo que ver con una versión diferente de .net o algo así.

Otra sugerencia que encontré fue construir todo el proyecto como x86, pero esto tampoco ha funcionado.

¿Alguien tiene alguna sugerencia que pueda probar? ¿Cómo puedo cambiar mi versión de .net objetivo a la de Awesomium? esto funcionara?

Respuesta aceptada

Arreglé el problema extrayendo el HTML del formulario web en un temporizador, luego mi WCF simplemente llama a un método que recoge los datos que se actualizaron desde la última marca del temporizador.

Entonces, sí, es probable que el problema sea que el componente WebCore no es seguro para subprocesos.

Gracias Groverboy!



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué