Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 试图读取或写入受保护的内存。仅当使用WCF时?Awesomium/HTML敏捷包_C#_Wcf_Html Agility Pack_Awesomium - Fatal编程技术网

C# 试图读取或写入受保护的内存。仅当使用WCF时?Awesomium/HTML敏捷包

C# 试图读取或写入受保护的内存。仅当使用WCF时?Awesomium/HTML敏捷包,c#,wcf,html-agility-pack,awesomium,C#,Wcf,Html Agility Pack,Awesomium,我有一个表单,可以从网站上抓取数据,使用Awesomium作为浏览器,使用HtmlAlityPack传递Html,然后使用WCF将其发送到另一个进程 当我使用表单上的按钮调用ScraperForm.GetData()方法时,我没有得到任何错误(javascript正确地抓取了html) 当我从其他表单(使用WCF客户端)调用它时,我的ScraperForm中出现以下错误: public partial class ScraperForm : Form { public string Ht

我有一个表单,可以从网站上抓取数据,使用Awesomium作为浏览器,使用HtmlAlityPack传递Html,然后使用WCF将其发送到另一个进程

当我使用表单上的按钮调用ScraperForm.GetData()方法时,我没有得到任何错误(javascript正确地抓取了html)

当我从其他表单(使用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!
    }
}
[服务合同]
公共接口IModelData
{
[经营合同]
ArrayList GetData();
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
公共类ModelDataClient
{
ChannelFactory HttpFactory;
imodeldatahttpproxy;
公共ModelDataClient()
{
HttpFactory=新的ChannelFactory(
新的BasicHttpBinding(),
新端点地址(“http://localhost:8000/ModelData"));
HttpProxy=HttpFactory.CreateChannel();
}
公共ArrayList GetData()
{
返回HttpProxy.GetData();
}
}
[ServiceBehavior(UseSynchronizationContext=false,InstanceContextMode=InstanceContextMode.Single)]
公共类ModelDataServer:IModelData
{
公共委托ArrayList GetData();
公共GetData_GetData{get;set;}
公共模型数据服务器()
{
}
公共ArrayList GetData()
{
return _GetData();//在此处调用(使用WCF)时会导致错误!
}
}
错误(指向Html=webControl.ExecuteJavascriptWithResult(“document.documentElement.outerHTML”).ToString();):

试图读取或写入受保护的内存。这通常是一个问题 表示其他内存已损坏

我认为这与设置我的scraper表单以管理员身份运行有关。谢谢你的帮助

更新:

我按照这里的说明:(关闭数据执行预防)仍然收到相同的错误

我相信问题在于Awesomium和我的程序的其他部分之间的错误匹配。与不同版本的.net或其他东西有关

我发现的另一个建议是将整个项目构建为x86,但这也不起作用


有人有什么建议我可以试试吗?如何将目标.net版本更改为Awesomium版本?这行得通吗?

我通过在计时器上从webform中提取HTML解决了这个问题,然后我的WCF只调用一个方法来获取从计时器最后一次滴答声中更新的数据

因此,是的,问题很可能是WebCore组件不是线程安全的


谢谢groverboy

HtmlDoc和webControl之间有什么关系?我想知道您是否需要在DataServer.HtmlDoc是HtmlAgilityPack.HtmlDoc之前初始化HtmlDoc(只是可以在html字符串上使用的函数库)。WebControl是我用来获取HTML的web浏览器(Awesomium)。谢谢。如果包含异常堆栈跟踪,可能会有所帮助。我注意到ModelDataServer上的属性包括
UseSynchronizationContext=false
。如果服务器在独立于WebControl的线程上执行,则可能需要封送从服务器到同一线程的调用。只是猜测而已!查看了Awesomium站点,该站点注意到WebCore组件不是线程安全的,对它的调用必须在创建它的同一线程上进行。论坛讨论中提到了损坏的内存。我不知道WebCore与WebControl的关系如何,但似乎您的服务器需要使用表单的同步上下文。有趣的解决方法!我假定计时器属于表单,并且计时器事件处理程序将HTML从WebControl复制到服务器对象。这意味着数据在表单线程上从表单移动到WCF:没有问题。但我怀疑现在有一个竞争条件:WCF可能在表单完成写入所有数据之前开始并完成读取复制的数据。我有一个名为data的字段(一个arraylist),在表单上调用timer data=GetData()的每个勾号(从html获取数据)。然后,通过WCF调用scraper表单只返回数据。没有比赛条件,我的数据不必是超级最新的。谢谢你。