2013-07-19 27 views
5

我正在創建WCF web services該自動化程序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窗口的進程標識,但不能將System.Diagnostics.Process轉換爲SHDocVw.InternetExplorer對象。如何唯一標識在會話0中運行的Internet Explorer窗口?

下面是我的代碼:

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; 
} 

任何幫助將非常感激。

+2

我覺得你的問題的唯一解決方案是創建運行在相同的會話與Internet Explorer衛星的過程。然後,不要試圖直接從Web服務控制Internet Explorer,而是使用一些進程間通信機制(如命名管道,WCF或.Net Remoting)將控制命令發送到您的衛星進程,然後控制命令即代表您的Web服務。您還應該確保您的Web服務和衛星進程之間的通信安全,特別是如果您的衛星進程以高於登錄用戶的特權運行。 – Hans

+1

請考慮使用[WebDriver](https://code.google.com/p/selenium/wiki/InternetExplorerDriver)。 – Aron

+0

謝謝@Hans ..我根據你的方法(使用命名管道)運行了一些測試,它工作得很好。謝謝你的幫助! – Neville

回答

2

在IIS7中完全逃避隔離是很困難的,但這是我在類似的情況下做的: 在IIS中,轉到應用程序池上的高級設置,並將其設置爲以Windows用戶身份運行。確保至少使用該用戶登錄過一次(.net創建一些未公開的文件夾)。 集加載用戶配置文件設置爲True

在我來說,我是自動化的MS Office,所以我有以下2個額外的步驟(第一可能適用): C:\ WINDOWS \ system32 \設置\ systemprofile創建桌面文件夾,給它寫權限 C:\ WINDOWS \ system32 \設置\ systemprofile \應用程序數據\漫遊\微軟\模板確保的Normal.dotm是存在的,它具有寫權限

接下來,在DCOM更改設置對象 Start -> run -> comexp.msc

打開Component Services -> Computers -> My Computer -> DCOM Config 位置如果您的用例允許,將WCF應用程序託管在WPF應用程序中,並且如果需要,您可以儘可能在應用程序內託管Internet Explorer窗口,這將給予你更控制。瀏覽器控件API起初看起來很有限(智能感知),直到將其轉換爲適當的類型爲止。如果需要,我可以發佈。

編輯:也看看http://support.microsoft.com/kb/555134

相關問題