2013-07-19 24 views
5

Tôi đang tạo WCF web services rằng automatea internet explorer. Có nhiều cuộc gọi dịch vụ web cần truy cập vào cùng một phiên bản Internet Explorer. Tuy nhiên, vì các dịch vụ WCF được lưu trữ trên IIS tất cả các cuộc gọi đến dịch vụ web được thực hiện trong phiên 0. Bây giờ để truy cập vào cùng một trường hợp Internet Explorer Tôi sử dụng thuộc tính SHDocVw.InternetExplorer.HWND trả về tay cầm cửa sổ của phiên bản Internet Explorer. Trong mã dưới đây khi được thực thi dưới dạng dịch vụ WCF trên IIS 7, tay cầm cửa sổ luôn trả về 0 do cách ly phiên 0. Ngoài ra, tôi không thể quay trở lại cùng một phiên bản IE hoặc lặp qua tất cả các cửa sổ mở IE. Tôi có thể liệt kê danh sách quy trình và tìm các id quá trình cho mỗi cửa sổ IE mở trong phiên 0, nhưng không thể đúc đối tượng System.Diagnostics.Process đến SHDocVw.InternetExplorer.Cách nhận dạng duy nhất một cửa sổ trình khám phá internet đang chạy trong phiên 0?

Dưới đây là mã của tôi:

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

Bất kỳ trợ giúp sẽ được nhiều đánh giá cao.

+2

Tôi nghĩ rằng giải pháp duy nhất cho vấn đề của bạn là tạo ra một quá trình vệ tinh mà chạy trong cùng một phiên như Internet Explorer. Sau đó, thay vì cố gắng kiểm soát trình duyệt internet trực tiếp từ dịch vụ web của bạn, hãy sử dụng một số cơ chế giao tiếp liên tiến trình (như đặt tên theo đường ống, WCF hoặc .Net Remoting) để gửi lệnh điều khiển cho quá trình vệ tinh của bạn. . Bạn cũng nên bảo đảm thông tin liên lạc giữa dịch vụ web và quy trình vệ tinh của mình, đặc biệt nếu quá trình vệ tinh của bạn chạy với các đặc quyền cao hơn người dùng đã đăng nhập. – Hans

+1

Thay vào đó, hãy cân nhắc sử dụng [WebDriver] (https://code.google.com/p/selenium/wiki/InternetExplorerDriver). – Aron

+0

Cảm ơn @Hans .. Tôi đã chạy một số thử nghiệm dựa trên cách tiếp cận của bạn (sử dụng các đường ống có tên) và nó hoạt động rất tốt. Cảm ơn bạn đã giúp đỡ! – Neville

Trả lời

2

Rất khó để thoát hoàn toàn cách ly trong IIS7, nhưng đây là những gì tôi đã làm trong một trường hợp tương tự: Trong IIS, hãy vào Cài đặt nâng cao trên hồ bơi ứng dụng của bạn và đặt nó chạy với tư cách người dùng cửa sổ. Đảm bảo bạn đã đăng nhập với người dùng đó ít nhất một lần (.net sẽ tạo một số thư mục không có giấy tờ). Đặt Tải Hồ sơ Người dùng thành True

Trong trường hợp của tôi, tôi đã tự động hóa MS Office, vì vậy tôi có 2 bước bổ sung sau (trước tiên có thể áp dụng): C: \ Windows \ System32 \ config \ systemprofile create Desktop folder, cung cấp cho nó viết quyền C: \ Windows \ System32 \ config \ systemprofile \ AppData \ Roaming \ Microsoft \ Templates đảm bảo Normal.dotm là có và nó có quyền ghi

Tiếp theo, thay đổi cài đặt trên DCOM đối tượng Start -> run -> comexp.msc

Mở Component Services -> Computers -> My Computer -> DCOM Config loca Nếu mục nhập của Internet Explorer, Right-click -> Properties -> Identity Tab -> select The interactive user

Ngoài ra, nếu trường hợp sử dụng của bạn cho phép, lưu trữ ứng dụng WCF bên trong ứng dụng WPF, và nếu cần, bạn có thể bạn kiểm soát nhiều hơn. API điều khiển trình duyệt dường như có giới hạn lúc đầu (intelli-sense wise) cho đến khi bạn truyền nó tới loại thích hợp. Tôi có thể đăng bài này nếu cần.

EDIT: Ngoài ra hãy xem tại http://support.microsoft.com/kb/555134

Các vấn đề liên quan