【问题标题】:call webbrowser control on code behind of asp.net page error?在asp.net页面错误后面的代码上调用webbrowser控件?
【发布时间】:2013-03-01 16:31:06
【问题描述】:

如何在 asp.net 页面后面的代码中使用 webbrowser 控件。我收到此错误:

无法实例化 ActiveX 控件,因为当前线程不在单线程单元中。

感谢您的帮助

Imports System.Windows.Forms
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Web.UI.WebControls

Partial Class _Default

    Dim testcontrol As New WebBrowser() ' it breaks here

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

        testcontrol.Navigate("mysite")

    End Sub

End Class

【问题讨论】:

  • 为什么 Page_Load 不公开?主站点是另一个文件,因此要捕获传播的事件 (Page_Load),处理程序需要公开。
  • 它不公开,因为它是如何自动添加的
  • 嗯是有道理的。你确定不需要重载 WebBrowser 吗?
  • 我确定 - 它适用于 win forms 应用程序 - 只是不知道为什么它不能在 asp.net 应用程序中工作
  • Webbrowser 是否还没有定义为HTTP_USERAGENT 或其他类似的东西?

标签: c# asp.net .net vb.net


【解决方案1】:

为什么要在 ASP.NET 应用程序的幕后使用 WebBrowser?如果您需要与另一台服务器上的网页进行交互,通常人们会使用HttpWebRequest

如果我错了,有人可以纠正我,但我相信网络应用程序,几乎按照定义,不能是单线程的。 Web 应用程序是多用户的,可以做多件事并同时容纳多个用户。

【讨论】:

  • 嗨 - 感谢您的回复 - 我正在尝试做的是在不加载另一个页面的情况下截屏。在 windows 窗体和 windows 控制台应用程序中我可以做到,这在 web 应用程序中必须是可能的吗?
  • @Hello-World “屏幕截图”是指创建页面的外观图像吗?或者抓取该页面的 HTML?该页面与您的应用在同一个域中还是完全不同?
  • 我正在尝试获取 Intranet 上另一个页面的图像,但它位于多个不同的域中
【解决方案2】:

这是有效的:

/// <summary>
        /// Returns a thumbnail for the current member values
        /// </summary>
        /// <returns>Thumbnail bitmap</returns>
        protected Bitmap GetThumbnail()
        {
            try
            {
            // WebBrowser is an ActiveX control that must be run in a single-threaded
            // apartment so create a thread to create the control and generate the
            // thumbnail
            Thread thread = new Thread(new ThreadStart(GetThumbnailWorker));
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            thread.Join();
            return _bmp;
            }
            catch (Exception ex)
            {
                using (StreamWriter writer = new StreamWriter("log.txt", true))
                {
                    writer.WriteLine(string.Format("[{0}] {1}", DateTime.Now.ToString(), ex.ToString()));
                    writer.Flush();
                    writer.Close();
                }
                return null;
            }
        }


/// <summary>
        /// Creates a WebBrowser control to generate the thumbnail image
        /// Must be called from a single-threaded apartment
        /// </summary>
        protected void GetThumbnailWorker()
        {
            try
            {
                using (WebBrowser browser = new WebBrowser())
                {
                    browser.ClientSize = new Size(_width, _height);
                    //browser.ScrollBarsEnabled = false;
                    browser.ScriptErrorsSuppressed = true;
                    browser.Navigate(_url);
                    // Wait for control to load page
                    while (browser.ReadyState != WebBrowserReadyState.Complete)
                        Application.DoEvents();
                    // Render browser content to bitmap
                    _bmp = new Bitmap(_thumbWidth, _thumbHeight);
                    browser.DrawToBitmap(_bmp, new Rectangle(0, 0, _thumbWidth, _thumbHeight));
                }
            }
            catch (Exception ex)
            {
                using (StreamWriter writer = new StreamWriter("log.txt", true))
                {
                    writer.WriteLine(string.Format("[{0}] {1}", DateTime.Now.ToString(), ex.ToString()));
                    writer.Flush();
                    writer.Close();
                }
            }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2010-09-26
    • 2011-01-08
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多