3
我相信WebBrowser控件是STA,并且托管在NT Service中的WCF服务是MTA? 谢谢。我需要做什么才能在WCF服务中使用System.Windows.Forms.WebBrowser控件?
我相信WebBrowser控件是STA,并且托管在NT Service中的WCF服务是MTA? 谢谢。我需要做什么才能在WCF服务中使用System.Windows.Forms.WebBrowser控件?
对,这可能不会起作用。 WebBrowser控件旨在被单个STA线程使用。它不会很好地映射到Web服务中的MTA,并且可能需要一些主要的骇客。
你想做什么?如果你能描述你的问题,我们可能会想出一个替代解决方案。
编辑
好吧,这可能是可能的,虽然肯定哈克。这里有一个理论实现:
的代码会是这个样子:
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不浏览,除非它的加入问题到视觉父母,例如表单。你的旅费可能会改变。祝你好运!
我想要做的是让WCF服务呈现一个html页面并抓取一个快照并将其保存到磁盘。谢谢。 – 2010-09-02 02:19:08
好的。这是可能的,只是可能会让屁股工作变得有点痛苦。我正在更新我的答案以包含理论实现。 – 2010-09-07 14:11:30
我已经更新了我的答案,包括一个可能的解决方案,尽管它是骇人听闻的。 – 2010-09-07 14:28:47