嘗試讀取或寫入受保護的內存。僅在使用WCF時? Awesomium / HTML Agility Pack

awesomium c# html-agility-pack wcf

我有一個從網站上刪除數據的表單,使用Awesomium作為瀏覽器和HTMLAgilityPack傳遞Html,並使用WCF將其發送到另一個進程。

當我用窗體上的按鈕調用方法ScraperForm.GetData()時,我沒有得到任何錯誤(javascript被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?這會有用嗎?

一般承認的答案

我通過在計時器上從webform中提取HTML來解決問題,然後我的WCF只調用一個方法來抓取從計時器的最後一個滴答中更新的數據。

所以是的,問題可能是WebCore組件不是線程安全的。

謝謝groverboy!



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow