在WCF服务中使用System.Windows.Forms.WebBrowser控件需要做什么?

Fre*_*res 3 c# browser wcf

我相信WebBrowser控件是STA,NT服务中托管的WCF服务是MTA吗?谢谢.

Jud*_*ngo 6

对,这可能行不通.WebBrowser控件旨在由单个STA线程使用.它不会很好地映射到Web服务中的MTA,并且可能需要一些主要的hackery.

你想做什么?如果您能描述您的问题,我们可能会提出替代解决方案.


编辑

好吧,这可能是可能的,虽然肯定是hacky.这是一个理论实现:

  1. 启动STA线程,让Web服务线程等待它.
  2. 在STA线程中加载浏览器.
  3. 导航到所需的网页.导航完成后,请截取屏幕截图.
  4. 将屏幕截图发送回Web服务线程.

代码看起来像这样:

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(); 
}
Run Code Online (Sandbox Code Playgroud)

此外,来自过去经验的一个注释:我们已经看到System.Windows.Forms.WebBrowser不会导航的问题,除非它被添加到可视父级,例如Form.你的旅费可能会改变.祝好运!