尝试读取或写入受保护的内存。仅在使用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