Попытка чтения или записи защищенной памяти. Только при использовании WCF? Пакет Awesomium / HTML Agility Pack

awesomium c# html-agility-pack wcf

Вопрос

У меня есть форма, которая сбрасывает данные с веб-сайта, используя Awesomium в качестве браузера и HTMLAgilityPack для передачи Html и отправляет его другому процессу с использованием WCF.

Когда я вызываю метод ScraperForm.GetData () с кнопкой в ​​форме, я не получаю ошибки (html правильно схвачен javascript).

Когда я вызываю это из своей другой формы (используя WCF-клиент), я получаю следующую ошибку в моем 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!
    }
}

Мой код взаимодействия между 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!
    }
}

Ошибка (указывает на Html = webControl.ExecuteJavascriptWithResult ("document.documentElement.outerHTML"). ToString ();):

Попытка чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена

Я думаю, что это связано с установкой формы скребка для запуска в качестве администратора или чего-то еще. Спасибо за вашу помощь.

Обновить:

Я выполнил следующие инструкции: http://jtstroup.net/post/Attempted-to-read-or-write-protected-memory-This-is-often-an-indication-that-other-memory-is-corrupt. aspx (Отключение предотвращения выполнения данных), и я все еще получаю ту же ошибку.

Я считаю, что проблема кроется в неправильном совпадении между Awesomium и остальной частью моей программы. Что-то делать с другой версией .net или что-то в этом роде.

Еще одно предложение, которое я нашел, состояло в том, чтобы построить весь проект как x86, но это тоже не сработало.

Есть ли у кого-нибудь предложения, которые я могу попробовать? Как я могу изменить свою целевую версию .net на версию Awesomium? Будет ли это работать?

Принятый ответ

Я исправил проблему, вытащив HTML из веб-формы по таймеру, тогда мой WCF просто вызывает метод, который захватывает данные, которые были обновлены с последнего тика таймера.

Так что да, проблема, вероятно, в том, что компонент WebCore не является потокобезопасным.

Спасибо, Гроувер!



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему