ASP.NET Web Session中的WebBrowser控件

时间:2013-07-29 08:07:26

标签: c# asp.net webbrowser-control

方案: 我想使用WebBrowser控件来代理研究项目的外部网站上的网站导航。因此,我尝试使用WebBrowser控件在页面请求中加载站点,并通过一些修改转发收到的HTML(如更改的src / href和javascript事件处理程序aso。)。当参与者/用户在代理网站上触发onclick事件时,我会在服务器上获取此事件,并希望在我的WebBrowser控件中重新触发它。

问题: 我无法弄清楚如何处理WebBrowser控件。最初我认为只是将它存储为会话对象的问题,但它必须在STA线程中运行的事实使这很困难。当用户调用onclick事件时,我需要相同的,活动的浏览器对象,以允许我在控件上单击此代理。 现在我使用Wrapper类IEBrowser:System.Windows.Forms.ApplicationContext。 我复制了来自不同来源的代码,主要来自(http://www.codeproject.com/Articles/50544/Using-the-WebBrowser-Control-in-ASP-NET),但它没有考虑对许多请求使用相同的WebBrowser控件。 以下是IEBrowser类中的一些代码:

public void Nav(string url)
{
    this.url = url;
    this.resultEvent = new AutoResetEvent(false);
    htmlResult = null;
    ths = new ThreadStart(delegate
    {
        // create a WebBrowser control
        ieBrowser = new WebBrowser();
        //Reset Session
        InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0);
        // set WebBrowser event handls
        ieBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(IEBrowser_DocumentCompleted);
        //make request
        ieBrowser.Navigate(url);

        System.Windows.Forms.Application.Run(this);
        //remove WebBrowser event handler
        ieBrowser.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(IEBrowser_DocumentIsCompleted);
        //for now, we keep the webBrowser open
        //ieBrowser.Dispose();
    });
    thrd = new Thread(ths);
    thrd.Name = "Thread 2";
    thrd.IsBackground = true;
    // set thread to STA state before starting
    thrd.SetApartmentState(ApartmentState.STA);
    thrd.Start();
    EventWaitHandle.WaitAll(new AutoResetEvent[] { resultEvent });
    thrd.Join();
}

// DocumentCompleted event handle
void IEBrowser_DocumentIsCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (ieBrowser.ReadyState == WebBrowserReadyState.Complete && ieBrowser.IsBusy == false)
    {
        //Replace or Set IDs on every HTML Element [...]
        //...
        //
        ieBrowser.Stop();
        ExitThread();
        //Dispose();
        resultEvent.Set();
    }
}

限制: 这不是关于性能,我需要做这个远程,但只有1-5人将同时使用该网站。我知道使用WebBrowser Control可能不是一个好的解决方案,但在这种情况下,它正是我需要捕获所有用户导航。

0 个答案:

没有答案