2010-02-24 3 views
9

Я пытался использовать элемент управления WebBrowser в приложении ASP .NET:управления WebBrowser в веб-приложении

public BrowserForm() 
     { 
      webBrowser1 = new WebBrowser(); 
      webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); 
     } 
private void webBrowser1_DocumentCompleted(Object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
    // code here 
    } 

Но есть ошибка:

'8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment

Тогда я сделал что-то вроде этого:

 public BrowserForm() 
     { 
      ThreadStart ts = new ThreadStart(StartThread); 
      var t = new Thread(ts); 
      t.SetApartmentState(ApartmentState.STA); 
      t.Start(); 

     } 
     [STAThread] 
     public void StartThread() 
     { 
      webBrowser1 = new WebBrowser(); 
      webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); 
     } 

     [STAThread] 
private void webBrowser1_DocumentCompleted(Object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      //code here 
     } 

Но все же он не работает для меня по вашему желанию ... давая мне ошибки, такие как:

Error HRESULT E_FAIL has been returned from a call to a COM component

Любая работа вокруг ?? Я не специалист по потоку или COM, но пытаюсь преобразовать WindowApplication в WebApplication, который берет скриншот веб-страницы с URL-адресом. :(

+0

Хотя вы просили решение, но просто думаю ... один из способов достижения того же, чтобы создать элемент управления ActiveX, который будет делать работу скриншоте, и добавить его в приложение ASP.NET ... –

ответ

6

Проверить эту Codeproject статью Using the WebBrowser Control in ASP.NET.

в этой статье перейти к спецификации раздела технической, и там вы можете увидеть, как он обрабатывается этим вопрос STA нити.

First of all, a WebBrowser control has to be in a thread set to single thread apartment (STA) mode (see MSDN), so I need to create a thread and call the SetApartmentState() method to set it to ApartmentState.STA before starting it.

Надеется, что это помогает

Cheer

+1

Как он справился с этой проблемой в STA? Я не считаю этот ответ полезным. Не могли бы вы рассказать, как он справился с этой проблемой, я не вижу этого. Это нехорошее объяснение, чтобы указать только на ссылку на другую страницу ... –

0

Вы можете установить AspCompat = «истинный» в директиве страничной страницы и она будет работать в ГНА. После того, как вы сделали это ваш первый пример должен работать

0

WinInet is not supported for use in services, что означает, что любое приложение, использующее WinInet, такое как элемент управления веб-браузером IE, не поддерживается в службах (например, asp.net).

0

Почему вы используете элемент управления webbrowser в приложении на основе asp.net?
Похоже, вы хотите иметь браузер в браузере.

Используя это, вы ограничиваете аудиторию использованием IE (и Windows, я полагаю).

Не можете ли вы использовать IFrame или Ajax или какую-либо другую альтернативу?
Опубликовать ваши причины & люди могут предложить лучшую альтернативу.

+0

«Почему?» в этом случае является контрпродуктивным. Либо дайте ответ, либо предложите способ выполнить задачу: «... пытаться преобразовать WindowApplication в WebApplication, который берет скриншот веб-страницы с URL-адресом». – Dror

+0

Почему? Поскольку я хочу напечатать HTML-страницу на принтере, и вы должны использовать WebBrowser. –