gpt4 book ai didi

c# - 我需要做什么才能在 WCF 服务中使用 System.Windows.Forms.WebBrowser 控件?

转载 作者:行者123 更新时间:2023-11-30 14:41:53 24 4
gpt4 key购买 nike

我相信 WebBrowser 控件是 STA,而托管在 NT 服务中的 WCFservice 是 MTA?谢谢。

最佳答案

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

你想做什么?如果您可以描述您的问题,我们或许可以提出替代解决方案。


编辑

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

  1. 启动一个 STA 线程,让 Web 服务线程等待它。
  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 无法导航的问题,除非它被添加到可视父级,例如表单。你的旅费可能会改变。祝你好运!

关于c# - 我需要做什么才能在 WCF 服务中使用 System.Windows.Forms.WebBrowser 控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3623304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com