2013-07-19 32 views
5

나는 WCF web services이 자동으로 internet explorer 인 것을 생성 중이다. Internet Explorer의 동일한 인스턴스에 액세스해야하는 여러 웹 서비스 호출이 있습니다. 그러나 WCF 서비스는 IIS에 호스팅되므로 웹 서비스에 대한 모든 호출은 세션 0에서 실행됩니다. 이제 Internet Explorer의 동일한 인스턴스에 액세스하려면 Internet Explorer 인스턴스의 창 핸들을 반환하는 SHDocVw.InternetExplorer.HWND 속성을 사용합니다. 아래 코드에서 IIS 7WCF 서비스로 실행하면 창 핸들은 세션 0 격리로 인해 항상 0을 반환합니다. 또한 열려있는 모든 IE 창을 통해 같은 IE 인스턴스 또는 루프로 다시 연결할 수 없습니다. 프로세스 목록을 열거하고 각 IE 창의 프로세스 ID를 세션 0에서 열어 볼 수 있지만 System.Diagnostics.ProcessSHDocVw.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

를보십시오. 그런 다음 웹 서비스에서 직접 인터넷 익스플로러를 제어하려고 시도하는 대신 (웹 서비스를 대신하여 제어하는) 위성 프로세스에 제어 명령을 보내기 위해 일부 프로세스 간 통신 메커니즘 (예 : 명명 된 파이프, WCF 또는 .Net Remoting)을 사용하십시오. . 특히 위성 프로세스가 로그온 한 사용자보다 높은 권한으로 실행되는 경우 웹 서비스와 위성 프로세스 사이의 통신을 보호해야합니다. – Hans

+1

대신 [WebDriver] (https://code.google.com/p/selenium/wiki/InternetExplorerDriver)를 사용하는 것이 좋습니다. – Aron

+0

Thanks @ Hans .. 명명 된 파이프를 사용하여 접근법을 기반으로 몇 가지 테스트를 실행했으며 매우 잘 작동합니다. 당신의 도움을 주셔서 감사합니다! – Neville

답변

2

IIS7에서 격리를 완전히 피하는 것은 어렵지만 비슷한 시나리오에서 수행 한 작업은 다음과 같습니다. IIS에서 응용 프로그램 풀의 고급 설정으로 이동하여 Windows 사용자로 실행되도록 설정하십시오. 해당 사용자와 최소한 한 번 로그인해야합니다 (.net은 문서화되지 않은 폴더를 만듭니다). 내 경우

진정한

에 설정로드 사용자 프로필 내가 MS 오피스 자동화, 그래서 나는 다음과 같은 두 단계를 추가로 (첫번째 적용 할 수 있습니다)했다 : C : \ WINDOWS \ system32를 \ 설정 \ systemprofile 바탕 화면 폴더를 생성, 이 권한을 C 쓰기 제공 : \ WINDOWS \ system32를 입력 \ 설정 \ systemprofile \의 AppData \ 로밍 \ 마이크로 소프트 \ 템플릿 확실히 Normal.dotm의이하고는 쓰기 권한

는 다음, DCOM에 설정 변경이 Start -> run -> comexp.msc

객체를 가지고

열기 Component Services -> Computers -> My Computer -> DCOM Config loca Right-click -> Properties -> Identity Tab -> select The interactive user

또는 WCF 응용 프로그램을 WPF 응용 프로그램 내에서 호스팅하고 필요한 경우 응용 프로그램 내부에 Internet Explorer 창을 호스팅 할 수 있습니다. 너 더 통제 해. 브라우저 컨트롤 API는 적절한 유형으로 캐스팅 할 때까지 처음에는 제한적으로 보입니다 (인텔리 센스 현명한). 필요한 경우 게시 할 수 있습니다.

편집 :는 또한 나는 당신의 문제에 대한 유일한 해결책은 인터넷 익스플로러와 같은 세션에서 실행되는 위성 프로세스를 만드는 것입니다 생각 http://support.microsoft.com/kb/555134