保護されたメモリを読み書きしようとしました。 WCFを使用している場合のみ? Awesomium / HTMLアジャイルパック

awesomium c# html-agility-pack wcf

質問

私はブラウザとしてAwesomiumを使用し、Htmlを渡すためにHTMLAgilityPackを使用して、WCFを使用して別のプロセスにデータを送信する、Webサイトからデータをスクラップするフォームを持っています。

フォーム上のボタンでメソッド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のバージョンに変更するにはどうすればよいですか?これは使えますか?

受け入れられた回答

私はタイマーのWebフォームからHTMLを引っ張って問題を解決しました。その後、WCFはタイマーの最後のティックから更新されたデータを取得するメソッドを呼び出します。

だから問題は、WebCoreコンポーネントがスレッドセーフではない可能性が高いことです。

ありがとうgroverboy!



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ