5

我正在创建WCF web services那个automata internet explorer。有多个 Web 服务调用需要访问Internet Explorer. 但是,由于WCF服务托管在IIS所有对 Web 服务的调用都在会话 0 中执行。现在要访问同一个实例,Internet Explorer我使用SHDocVw.InternetExplorer.HWND返回实例的窗口句柄的属性Internet Explorer。在下面的代码中,当在窗口句柄上作为WCF服务执行时,IIS 7由于会话 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;
}

任何帮助都感激不尽。

4

1 回答 1

2

在 IIS7 中完全摆脱隔离是很困难的,但这是我在类似情况下所做的:在 IIS 中,转到应用程序池的高级设置,并将其设置为以 Windows 用户身份运行。确保您至少使用该用户登录过一次(.net 会创建一些未记录的文件夹)。将加载用户配置文件设置为 True

在我的情况下,我正在自动化 MS Office,所以我有以下 2 个附加步骤(第一个可能适用): C:\Windows\System32\config\systemprofile 创建桌面文件夹,给它写权限 C:\Windows\System32\config \systemprofile\AppData\Roaming\Microsoft\Templates 确保 Normal.dotm 在那里并且它具有写入权限

接下来,更改 DCOM 对象的设置 Start -> run -> comexp.msc

打开Component Services -> Computers -> My Computer -> DCOM Config 找到 Internet Explorer 条目,Right-click -> Properties -> Identity Tab -> select The interactive user

或者,如果您的用例允许,在 WPF 应用程序中托管 WCF 应用程序,如果需要,您可以在应用程序中托管 Internet Explorer 窗口,这将为您提供更多控制权。浏览器控制 API 一开始似乎是有限的(智能意义上的),直到您将其转换为适当的类型。如果需要,我可以发布这个。

编辑:也看看http://support.microsoft.com/kb/555134

于 2014-01-15T18:11:07.237 回答