보호 된 메모리를 읽거나 쓰려고 시도했습니다. WCF를 사용할 때만? Awesomium / HTML 민첩성 팩

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 프로세스 간 통신 코드 :

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

오류 (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!




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.