2013-07-19 4 views
5

मैं WCF web services बना रहा हूं जो automatea internet explorer है। कई वेब सेवा कॉल हैं जिन्हें Internet Explorer के उसी उदाहरण तक पहुंचने की आवश्यकता है। हालांकि, WCF सेवाओं को IIS पर होस्ट किया गया है, इसलिए वेब सेवा के लिए सभी कॉल सत्र 0 में निष्पादित की जाती हैं। Internet Explorer के उसी उदाहरण तक पहुंचने के लिए मैं SHDocVw.InternetExplorer.HWND प्रॉपर्टी का उपयोग करता हूं जो Internet Explorer इंस्टेंस के विंडो हैंडल को लौटाता है। IIS 7 पर WCF सेवा के रूप में निष्पादित किए जाने पर नीचे कोड में विंडो 0 अलगाव के कारण विंडो हैंडल हमेशा 0 लौटाते हैं। साथ ही, मैं सभी खुले IE विंडोज़ के माध्यम से उसी IE इंस्टेंस या लूप पर वापस हुक नहीं कर पा रहा हूं। मैं प्रक्रिया सूची का आकलन कर सकता हूं और सत्र 0 में प्रत्येक IE विंडो के लिए प्रक्रिया आईडी ढूंढ सकता हूं, लेकिन System.Diagnostics.ProcessSHDocVw.InternetExplorer ऑब्जेक्ट को नहीं डाला जा सकता।सत्र 0 में चल रहे इंटरनेट एक्सप्लोरर विंडो को विशिष्ट रूप से कैसे पहचानें?

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

पर एक नज़र मुझे लगता है कि आपकी समस्या का एकमात्र समाधान एक उपग्रह प्रक्रिया है जो इंटरनेट एक्सप्लोरर के रूप में एक ही सत्र में चलाता है बनाने के लिए है ले लो। फिर अपनी वेब सेवा से सीधे इंटरनेट एक्सप्लोरर को नियंत्रित करने की कोशिश करने के बजाय कुछ इंटर-प्रोसेस संचार तंत्र (जैसे नामित पाइप, डब्ल्यूसीएफ या नेट रीमोटिंग) का उपयोग अपनी उपग्रह प्रक्रिया में नियंत्रण आदेश भेजने के लिए करें, जो तब आपकी वेब सेवा की ओर से नियंत्रित करता है । आपको अपनी वेब सेवा और आपकी उपग्रह प्रक्रिया के बीच संचार को भी सुरक्षित रखना चाहिए, खासकर यदि आपकी उपग्रह प्रक्रिया लॉग ऑन उपयोगकर्ता की तुलना में उच्च विशेषाधिकारों के साथ चलती है। – Hans

+1

इसके बजाय [WebDriver] (https://code.google.com/p/selenium/wiki/InternetExplorerDriver) का उपयोग करने पर विचार करें। – Aron

+0

धन्यवाद @ हंस .. मैंने आपके दृष्टिकोण (नामित पाइप का उपयोग करके) के आधार पर कुछ परीक्षण चलाए और यह बहुत अच्छी तरह से काम करता है। आपकी सहायताके लिए धन्यवाद! – Neville

उत्तर

2

आईआईएस 7 में अलगाव से पूरी तरह से बचना मुश्किल है, लेकिन मैंने इसी तरह के परिदृश्य में क्या किया है: आईआईएस में, अपने एप्लिकेशन पूल पर उन्नत सेटिंग्स पर जाएं, और इसे विंडोज उपयोगकर्ता के रूप में चलाने के लिए सेट करें। सुनिश्चित करें कि आपने कम से कम एक बार उस उपयोगकर्ता के साथ लॉग इन किया है (.net कुछ अनियंत्रित फ़ोल्डर्स बनाता है)। करने के लिए यह सच है

मेरे मामले में सेट लोड उपयोगकर्ता प्रोफ़ाइल मैं एमएस ऑफ़िस स्वचालित किया गया था, तो मैं निम्नलिखित 2 अतिरिक्त कदम (पहले लागू हो सकता है) था: C: \ Windows \ System32 \ config \ systemprofile डेस्कटॉप फ़ोल्डर बनाते हैं, यह अनुमतियाँ लिखने सी दे: \ Windows \ System32 \ config \ systemprofile \ AppData \ रोमिंग \ Microsoft \ टेम्पलेट्स यकीन Normal.dotm है बनाने के लिए और यह लिखने की अनुमति

इसके बाद, DCOM पर परिवर्तन सेटिंग्स वस्तुओं Start -> run -> comexp.msc

है

ओपन Component Services -> Computers -> My Computer -> DCOM Config लोक ते इंटरनेट एक्सप्लोरर एंट्री, Right-click -> Properties -> Identity Tab -> select The interactive user

वैकल्पिक रूप से, यदि आपका उपयोग केस अनुमति देता है, तो डब्ल्यूसीएफ एप्लिकेशन को एक WPF एप्लिकेशन के अंदर होस्ट करें, और यदि आवश्यक हो, तो आप ऐप के अंदर एक इंटरनेट एक्सप्लोरर विंडो होस्ट करने के लिए जा सकते हैं, जो आप अधिक नियंत्रण। ब्राउजर कंट्रोल एपीआई पहले (इंटेलि-समझदार) तक सीमित प्रतीत होता है जब तक कि आप इसे उचित प्रकार तक नहीं डाल देते। यदि आवश्यक हो तो मैं इसे पोस्ट कर सकता हूं।

संपादित करें: इसके अलावा http://support.microsoft.com/kb/555134

संबंधित मुद्दे