2009-05-09 29 views
21

सी # 2008 एसपी 1इंटरनेट कनेक्शन का परीक्षण करने का सबसे तेज़ तरीका

मैं इस क्लाइंट वेबसाइट से कनेक्ट करने के लिए इस कोड का उपयोग कर रहा हूं। यह एक सॉफ्टफोन एप्लिकेशन के लिए है। उपयोगकर्ता कॉल करने से पहले, सॉफ्टफ़ोन को परीक्षण करना पड़ता है कि कोई सक्रिय इंटरनेट कनेक्शन है या नहीं।

तो, मैं चाहता हूं कि मैंने अपनी क्लाइंट वेबसाइट से कनेक्ट करने के लिए httpWebRequest क्लास का उपयोग किया है। अगर प्रतिक्रिया ठीक है, तो इंटरनेट कनेक्शन आगे बढ़ सकता है।

हालांकि, मैंने देखा है कि प्रतिक्रिया का जवाब देने में बहुत लंबा समय लग रहा है। मुझे यकीन नहीं है कि यह परीक्षण करने का एक बहुत ही प्रभावी तरीका नहीं है।

हालांकि, जब मैं अपनी वेबसाइट पर ब्राउज़ करता हूं, तो पृष्ठ को लोड करने में एक सेकंड से भी कम समय लगता है। लेकिन बहुत समय लगता है जब मैं HttpWebRequest वर्ग का उपयोग

तो इस के लिए आवश्यकताएँ हैं:

कुछ समय एक प्रॉक्सी ग्राहक के कार्यालय में इस्तेमाल किया जाएगा। मैं टीसीपी क्लाइंट क्लास का उपयोग नहीं कर सकता (इसमें प्रॉक्सी प्रॉपर्टी नहीं है)।

प्रॉक्सी सॉक्स का समर्थन नहीं करता है इसलिए सॉकेट वर्ग का उपयोग नहीं कर सकता है।

मुझे टाइमआउट संपत्ति का उपयोग करने की आवश्यकता है। तो वेब क्लाइंट क्लास का उपयोग नहीं कर सकते हैं। ऐसा इसलिए है क्योंकि जब तक प्रतिक्रिया वापस नहीं आती है तब तक सॉफ्टफ़ोन स्थिर हो जाता है। तो कुछ सेकंड के बाद टाइमआउट।

तो केवल एक ही जिसे मैं सोच सकता हूं वह है HttpWebRequest क्लास।

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.xxxxxxxxx.com"); 
      request.Timeout = 5000; 
      request.Credentials = CredentialCache.DefaultNetworkCredentials; 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

      if (response.StatusCode == HttpStatusCode.OK) 
      { 
       Console.WriteLine("IsSIPServerAvailable: " + response.StatusCode); 
       isAvailable = true; 
      } 

======== संपादित करें का उपयोग कर पी \ आह्वान ====

[DllImport("wininet.dll", CharSet = CharSet.Auto)] 
    private extern static bool InternetGetConnectedState(ref InternetConnectionState_e lpdwFlags, int dwReserved); 

[Flags] 
    enum InternetConnectionState_e : int 
    { 
     INTERNET_CONNECTION_MODEM = 0x1, 
     INTERNET_CONNECTION_LAN = 0x2, 
     INTERNET_CONNECTION_PROXY = 0x4, 
     INTERNET_RAS_INSTALLED = 0x10, 
     INTERNET_CONNECTION_OFFLINE = 0x20, 
     INTERNET_CONNECTION_CONFIGURED = 0x40 
    } 

// In function for checking internet 
InternetConnectionState_e flags = 0;   
bool isConnected = InternetGetConnectedState(ref flags, 0); 

उत्तर

16

का उपयोग कर पी/आह्वान InternetGetConnectedState कॉल करने के लिए प्रयास करें। यह आपको बताएगा कि आपके पास कॉन्फ़िगर किया गया कनेक्शन है या नहीं। फिर आप InternetCheckConnection का उपयोग कर अपनी सेवा के विशिष्ट कनेक्शन की जांच करने का प्रयास कर सकते हैं। यह सीधे कनेक्शन को जोड़ने से पहले (कभी-कभी) तेज होता है, लेकिन मैं यह देखने के लिए परीक्षण करता हूं कि यह सिर्फ एक पूर्ण कनेक्शन करने से बेहतर है या नहीं।

+3

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

+1

मैंने पी/Invoke के लिए अपना कोड संपादित किया है। हालांकि, यह मुझे बताता है कि लैन मेरे कंप्यूटर से जुड़ा हुआ है (प्लग इन या आउट)। हालांकि, यह मुझे नहीं बता सकता कि मेरे पास एक सक्रिय इंटरनेट कनेक्शन है (इंटरनेट ब्राउज़ करें)। – ant2009

+0

@robUK: मैंने इंटरनेट चेक कनेक्शन में कॉल शामिल करने के लिए अपना उत्तर संपादित किया। यह एक और पी/Invoke है जिसे आप कोशिश कर सकते हैं - यह आपको बताएगा कि वह विशिष्ट यूआरएल उपलब्ध है या नहीं, लेकिन मेरा मानना ​​है कि यह एक कनेक्शन को हुक करने की कोशिश करने से थोड़ा तेज है। –

11

अपने वास्तविक संचार के लिए उपयोग करने के लिए सॉफ्टफ़ोन क्या उपयोग कर रहा है? क्या यह एक ही वेबसाइट पर HTTP/HTTPS पर जा रहा है? यदि ऐसा है, तो यह बिल्कुल सही तरीका है - अगला कदम यह काम करना है कि यह इतना समय क्यों ले रहा है।

क्या अनुरोध से पहले नेटवर्क कनेक्शन निश्चित रूप से ऊपर है? क्या आप निश्चित रूप से पहले से कोई अनुरोध कर रहे हैं? मैं पूछता हूं क्योंकि मुझे लगता है कि आप प्रतिक्रिया का निपटारा नहीं कर रहे हैं - अगर यह कहीं और भी होता है, तो आप पाएंगे कि आप कनेक्शन पूल के खिलाफ चल रहे हैं केवल आपको किसी विशेष सर्वर से कुछ कनेक्शन दे रहे हैं। नैतिक हमेशाHttpWebResponse एस using कथन में डाल दिया गया है। बेशक, यह अच्छी तरह से आपके मामले में समस्या हो सकती है, लेकिन यह एक कोशिश के लायक है।

यदि आपका वास्तविक एप्लिकेशन कहीं और कनेक्ट होने जा रहा है, तो वह जगह है जहां आपका परीक्षण भी जांचना चाहिए। असल में, इसे यथासंभव वास्तविक चीज़ के करीब बनाओ।

ब्याज में से, आप कहते हैं कि यह एक "softphone" अनुप्रयोग है - यह वास्तव में, कुछ विवरण के एक फोन पर चल रहा है कॉम्पैक्ट फ्रेमवर्क का उपयोग कर, या यह एक डेस्कटॉप अनुप्रयोग है?

+0

हैलो। यह एक डेस्कटॉप चल रहा है जो 2000, एक्सपी और विस्टा पर चल सकता है। उपयोग कथन पर जानकारी के लिए। मैं वह भूल गया। एसआईपी सर्वर एक ही सर्वर पर है। हालांकि, मैं एसआईपी प्रोटोकॉल और आरटीपी का उपयोग कर स्ट्रीमिंग का उपयोग कर कनेक्ट कर सकता हूं। – ant2009

+0

यदि आप वास्तव में एसआईपी के साथ जुड़ने जा रहे हैं, तो परीक्षण के लिए एसआईपी से कनेक्ट क्यों न करें? क्या कोई नो-ऑप एसआईपी अनुरोध है जो आप कर सकते हैं? –

+0

मैं कुछ एसआईपी अनुरोधों को देख रहा हूं। मुझे नीचे पी/आवेषण विकल्प भी पसंद है। मुझे लगता है कि मैं प्रयोग करेंगे दोनों विकल्प होगा। धन्यवाद। – ant2009

2

आप MicrosoftAVailableEventHandler प्रतिनिधि और नेटवर्क क्लास का उपयोग करने के लिए Microsoft.VisualBasic.Devices नामस्थान का संदर्भ दे सकते हैं। मैं नेटवर्क का उपयोग करता हूं। यह उपलब्ध संपत्ति और नेटवर्क। नेटवर्क उपलब्धता उपलब्धता जांचने के लिए कि नेटवर्क वहां है (या बाद में प्रभावित है), और उसके बाद HTTP सर्वर को यह देखने के लिए करें कि सर्वर वहां है या नहीं।

यह "नेटवर्क नहीं देख सकता" की बजाय समस्या को थोड़ा और विशेष रूप से रिपोर्ट करने में मदद करता है।

6

मेरे पास ऐसी ही स्थिति थी जहां हम एक ग्राहक को डब्ल्यूसीएफ कॉल करने जा रहे थे और यदि ग्राहक पहुंच योग्य नहीं था तो यह बहुत लंबा लगेगा (किसी भी कारण से)। मैंने जो किया वह क्लाइंट एड्रेस में कच्ची टीसीपी सॉकेट खोल रहा था ... अगर ग्राहक पोर्ट (आपके मामले पोर्ट 80 में) नहीं सुन रहा है तो यह जल्दी से विफल हो जाता है और यदि वे वहां हैं तो जल्दी से सफल हो जाते हैं।

इसने मुझे यह निर्धारित करने का सबसे तेज़ और सबसे सटीक उत्तर दिया कि क्या मैं उस अंतराल के साथ संवाद करने में सक्षम हूं कि मैं पहुंचने की कोशिश कर रहा था। इसका एकमात्र नीचे यह है कि आपको सॉकेट पर टाइमआउट का प्रबंधन करना होगा क्योंकि कनेक्ट करने और प्राप्त करने के लिए केवल विकल्प ही कनेक्ट नहीं हैं।

वह कुछ इस तरह चला जाता है ...

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

    try 
    { 
     IAsyncResult result = socket.BeginConnect("www.xxxxxxxxx.com", 80, null, null); 
     //I set it for 3 sec timeout, but if you are on an internal LAN you can probably 
     //drop that down a little because this should be instant if it is going to work 
     bool success = result.AsyncWaitHandle.WaitOne(3000, true); 

     if (!success) 
     { 
       throw new ApplicationException("Failed to connect server."); 
     } 

     // Success 
     //... 
    } 
    finally 
    { 
     //You should always close the socket! 
     socket.Close(); 
    } 

मैं वास्तविक कोड है कि मैं मेरे सामने इस्तेमाल किया नहीं है, लेकिन यह सामान्य रास्ते पर डाल देना चाहिए।

+0

हैलो, कोड के लिए धन्यवाद। असल में मैंने पहले से ही सॉकेट वर्ग की कोशिश की है। हालांकि, प्रॉक्सी सर्वर जो मुझे कनेक्ट करना है, सॉक्स प्रोटोकॉल का समर्थन नहीं करता है।अगर यह प्रॉक्सी सर्वर के लिए नहीं था, तो यह एक अच्छा समाधान होगा। – ant2009

+0

क्षमा करें, मुझे आपके प्रश्न में याद आया ... –

+0

ओनेल, इसके लिए धन्यवाद। मैं एक टीसीपी क्लाइंट का उपयोग कर रहा था, और यह इस विधि के बाद बहुत धीमी थी। –

1

माइक्रोसॉफ्ट के संदर्भ में एक बेहतर विकल्प है। VisualBasic और एक उपयोग कथन Microsoft को जोड़ें। VisualBasic.Device तो आप किसी भी नेटवर्क से कनेक्शन की जांच के लिए कोड की निम्न पंक्ति का उपयोग कर सकते हैं।

public static bool isConnectedToNetwork { 
    get { 
     Network network = new Network(); 
     return network.IsAvailable; 
    } 
} 
0

request.GetResponse()ही आप एक अपवाद दे देंगे अगर होस्ट नाम, हालांकि नहीं सुलझाया जा सकता है, तो आपको लगता है कि चारों ओर एक कोशिश पकड़ डाल करने के लिए चाहते हो सकता है, System.Net.WebException पकड़ने, और अपने त्रुटि की स्थिति की जांच Status संपत्ति। मुझे यकीन नहीं है कि कौन सी स्थितियां बिल्कुल इंटरनेट का संकेत नहीं देगी, हालांकि; अधिकांश प्रतिक्रियाएं डीएनएस या अन्य कनेक्शन समस्याओं के कारण भी हो सकती हैं।

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