Что мне нужно сделать, чтобы использовать элемент управления System.Windows.Forms.WebBrowser в службе WCF? - PullRequest
3 голосов
/ 02 сентября 2010

Я считаю, что элемент управления WebBrowser - это STA, а служба WCF, размещенная в службе NT, - это MTA?Спасибо.

1 Ответ

6 голосов
/ 02 сентября 2010

Правильно, это скорее всего не сработает.Элемент управления WebBrowser предназначался для использования одним потоком STA.Он не будет хорошо отображаться в MTA в веб-сервисе и, вероятно, потребует некоторых серьезных хакерских атак.

Что вы пытаетесь сделать?Если вы можете описать вашу проблему, мы сможем найти альтернативное решение.


edit

Хорошо, это возможно, хотя, конечно,Hacky.Вот теоретическая реализация:

  1. Раскрутите поток STA, дождитесь его потока веб-службы.
  2. Загрузите браузер в поток STA.
  3. Навигацияна нужную веб-страницу.Когда навигация завершится, сделайте снимок экрана.
  4. Отправьте снимок назад в ветку веб-службы.

Код будет выглядеть примерно так:

public Bitmap GiveMeScreenshot()
{
    var waiter = new ManualResetEvent();
    Bitmap screenshot = null;

    // Spin up an STA thread to do the web browser work:
    var staThread = new Thread(() =>
    {
        var browser = new WebBrowser();
        browser.DocumentCompleted += (sender, e) => 
        {
            screenshot = TakeScreenshotOfLoadedWebpage(browser);
            waiter.Set(); // Signal the web service thread we're done.
        }
        browser.Navigate("http://www.google.com");
    };
    staThread.SetApartmentState(ApartmentState.STA);
    staThread.Start();

    var timeout = TimeSpan.FromSeconds(30);
    waiter.WaitOne(timeout); // Wait for the STA thread to finish.
    return screenshot;
};

private Bitmap TakeScreenshotOfLoadedWebpage(WebBrowser browser)
{
    // TakeScreenshot() doesn't exist. But you can do this using the DrawToDC method:
    // http://msdn.microsoft.com/en-us/library/aa752273(VS.85).aspx
    return browser.TakeScreenshot(); 
}

Такжепримечание из прошлого опыта: мы видели проблемы, когда System.Windows.Forms.WebBrowser не перемещается, если он не добавлен к визуальному родителю, например к Форме.Ваш пробег может варьироваться.Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...