【发布时间】:2013-07-19 00:35:41
【问题描述】:
我正在创建 WCF web services 自动化 internet explorer。有多个 Web 服务调用需要访问 Internet Explorer 的同一实例。但是,由于WCF 服务托管在IIS 上,所有对Web 服务的调用都在会话0 中执行。现在要访问Internet Explorer 的同一个实例,我使用SHDocVw.InternetExplorer.HWND 属性,它返回一个窗口句柄Internet Explorer 实例。在下面的代码中,当在IIS 7 上作为WCF 服务执行时,由于会话 0 隔离,窗口句柄始终返回 0。此外,我无法连接到同一个 IE 实例或循环访问所有打开的 IE 窗口。我可以枚举进程列表并查找会话 0 中打开的每个 IE 窗口的进程 ID,但不能将 System.Diagnostics.Process 转换为 SHDocVw.InternetExplorer 对象。
下面是我的代码:
public int GetWhd()
{
InternetExplorer ie = new InternetExplorer();
ie.Visible = true;
return ie.HWND;
}
public int SetWhd(string whd)
{
int wh = Int32.Parse(whd);
InternetExplorer ie = null;
ShellWindows s = new ShellWindows();
foreach (SHDocVw.InternetExplorer ie1 in s)
{
try
{
if (ie1.HWND == wh)
{
ie = ie1;
break;
}
}
catch { return 2; }
}
if (ie != null) { ie.Navigate("www.google.com"); return 1; }
return 0;
}
任何帮助将不胜感激。
【问题讨论】:
-
我认为解决您的问题的唯一方法是创建一个与 Internet Explorer 在同一会话中运行的附属进程。然后,不要尝试直接从您的 Web 服务控制 Internet Explorer,而是使用一些进程间通信机制(例如命名管道、WCF 或 .Net Remoting)向您的卫星进程发送控制命令,然后代表您的 Web 服务进行控制.您还应该保护您的网络服务和卫星进程之间的通信,尤其是当您的卫星进程以比登录用户更高的权限运行时。
-
考虑改用WebDriver。
-
谢谢@Hans .. 我根据您的方法(使用命名管道)进行了一些测试,效果很好。感谢您的帮助!
-
@Aron 我已经为个别任务开发了程序,因此使用 WebDriver 重写所有代码对我来说是不可行的。另外,我不确定使用 web-driver 是否有助于识别 IE 窗口句柄,因为这里的问题不是 sHdocVW,而是会话 0 隔离。但是,我会记住这一点以供将来参考..谢谢..
-
@Neville 我的观点是,在使用 webdriver 时,您可能不需要唯一标识 IE 窗口句柄的实例。它具有适用于大多数自动化任务的钩子。
标签: c# wcf internet-explorer-8 session-0-isolation