6

पर "अंतर्निहित कनेक्शन बंद था" प्राप्त करना मेरे पास VB.NET (नहीं एएसपीनेट में लिखा गया एक एप्लिकेशन है, यह एक विंडोज कंसोल ऐप है)। मैं एक यूआरएल (एक एचटीएमएल पेज) कॉल करने की कोशिश कर रहा हूं और एक स्ट्रिंग में प्रतिक्रिया वापस प्राप्त कर रहा हूं। प्रतिक्रिया सीधे जेएसओएन है, कोई भी एचटीएमएल टैग नहीं। यह { के साथ खुलता है और } के साथ बंद हो जाता है।HttpWebRequest

मैं HttpWebRequest ऑब्जेक्ट ठीक बना देता हूं। फिर req.GetResponse() पर कॉल करें। जैसे ही मैं ऐसा करता हूं मुझे त्रुटि मिलती है The underlying connection was closed: The connection was closed unexpectedly. मैं googling और stackoverflow की जांच कर रहा हूं, और जो भी मैंने पाया है उसे लागू करने की कोशिश की है (इसमें से बहुत से डब्ल्यूसीएफ सेवा कॉन्फ़िगरेशन के साथ करना है, जो लागू नहीं होता है)।

यहाँ मेरी कोड है:

Public Function GetJSON(ByRef d As db.Device) As Boolean 
    Try 
     d.Url = "http://" & d.IpAddress & ini.doc.<svc>.<url>.Value 

     Dim req As HttpWebRequest = HttpWebRequest.Create(d.Url) 
     // req.Accept = "*/*" 
     // req.Timeout = 30000 
     // req.ReadWriteTimeout = 30000 
     // req.KeepAlive = False 
     // req.UseDefaultCredentials = True 
     // req.CachePolicy = HttpWebRequest.DefaultCachePolicy 
     // req.Proxy = HttpWebRequest.DefaultWebProxy 
     // req.ProtocolVersion = New System.Version(1, 0) 

     Dim rsp As HttpWebResponse = req.GetResponse() 

     Return True 
    Catch ex As Exception 
     Log(ex.Message) 
     Return False 
    Finally 
     rsp = Nothing 
     req = Nothing 
    End Try 
End Function 

लाइनों पर टिप्पणी की (गलत टिप्पणी शैली, लेकिन इतना अतः यह सही पार्स जाएगा) सब बातों मैं क्या मिल गया है पर मैं अब तक के आधार की कोशिश की है ऑनलाइन कर रहे हैं । उनमें से कोई भी इसे ठीक नहीं किया। मैंने सत्यापित किया है कि बनाया गया यूआरएल सही है; अगर मैं अपने ब्राउज़र में एक ही यूआरएल को कॉल करता हूं तो यह बिल्कुल सही उम्मीद की प्रतिक्रिया देता है।

मैं इसे wiresharking की कोशिश की है ... और मैं वास्तविक उम्मीद, पूरा डेटा शार्क उत्पादन में वापस कुछ लाइनें आते हैं, और फिर, और फिर एक लाल रेखा जो कहते हैं: http > 51943 [RST] Seq=1607 Win=0 Len=0 जो अंतिम पंक्ति है .NET त्रुटि को फेंकने से पहले दिखाने के लिए।

मैं भी इतने पर यहाँ एक पोस्ट प्रति पर System.Net ट्रेसिंग/प्रवेश मोड़ की कोशिश की, और से है कि मैं इसी तरह सभी की उम्मीद JSON डेटा को देखने के वापस आना है, लेकिन बाद में इसे वापस आता है यह इन पंक्तियों फेंकता आउटपुट फ़ाइल में .NET ट्रेस लॉग में:

System.Net.Sockets Verbose: 0 : [7040] Exiting Socket#60467532::Receive() -> 1605#1605 
System.Net.Sockets Verbose: 0 : [7040] Socket#60467532::Receive() 
System.Net.Sockets Verbose: 0 : [7040] Data from Socket#60467532::Receive 
System.Net.Sockets Verbose: 0 : [7040] 00000000 :             : 
System.Net.Sockets Verbose: 0 : [7040] Exiting Socket#60467532::Receive() -> 0#0 
System.Net.Sockets Verbose: 0 : [7040] Socket#60467532::Dispose() 
System.Net Error: 0 : [7040] Exception in the HttpWebRequest#27806816:: - The underlying connection was closed: The connection was closed unexpectedly. 
System.Net Error: 0 : [7040] Exception in the HttpWebRequest#27806816::GetResponse - The underlying connection was closed: The connection was closed unexpectedly. 

कोई विचार यह कहने के लिए आगे जाने के लिए कहां जाना है? हम इस डेटा को कुछ पर्यावरण-निगरानी सेंसर उपकरणों से बाहर पढ़ रहे हैं, और उन्होंने हमें उपयोग करने के लिए यह यूआरएल दिया है।

दो चीजें हैं जो वास्तव में मुझे मिलता है और इस पर मुझे भ्रमित है कि
क) यह जब एक ब्राउज़र
ख में कहा जाता है पूरी तरह से ठीक काम करता है) दोनों WireShark और .NET सभी डेटा वास्तव में है दिखाने लगाने होते वापस आ रहा है, और फ्रेमवर्क किसी भी कारण से सभी डेटा प्राप्त करने के बाद छोड़कर है!

WebException ही बहुत कम इस्तेमाल किया जा रहा है, जैसा कि इसके InnerException रिक्त है और इसकी स्थिति सिर्फ कहते हैं, "ConnectionClosed {8}" पहले से

धन्यवाद !!!

अद्यतन 18/08 1130: मैं भी अब सिर्फ System.Net.WebRequest का उपयोग कर की कोशिश की है के रूप में HttpWebRequest करने का विरोध किया। इससे कोई फर्क नहीं पड़ता।

अद्यतन 18/08 1222: मैं बस अपना कोड स्विचन बजाय के बजाय एक WebClient वस्तु ऊपर मंद करने के लिए [Http]Web[Request|Response] का उपयोग कर और उसके DownloadString() विधि का उपयोग करने की कोशिश की। हालांकि भी समान सटीक त्रुटि फेंकता है।

अद्यतन 08/18 1230:My.Computer.Network.DownloadFile() का उपयोग करने का प्रयास किया - एक ही कनेक्शन बंद त्रुटि भी मिलती है।

+0

यहाँ मेरा पूरा network.log नेट का पता लगाने के एक pastebin है फ़ाइल: http://pastebin.com/QfY05a11। आप लाइन 41 पर वापस आने वाले सभी JSON डेटा देख सकते हैं। – eidylon

+0

यहां वायरसहार्क ट्रैफ़िक लॉग का पेस्टबिन है: http://pastebin.com/0hbEQerc। आप लाइन 607 पर वापस आने वाले डेटा को देख सकते हैं। – eidylon

उत्तर

4

क्या आप पेस्टबिन.com पर ट्रेस लॉग की पूरी सामग्री पोस्ट कर सकते हैं और यहां एक लिंक पोस्ट कर सकते हैं?

आपको यह अपवाद मिल रहा है क्योंकि सर्वर "सामग्री-लंबाई" शीर्षलेख में कह सकता है कि यह इकाई के एन बाइट्स भेज रहा है, लेकिन वास्तव में एन बाइट्स से कम भेज रहा है और कनेक्शन बंद कर रहा है।

उत्तर:

डेटा के लिए धन्यवाद। Tracelog और wireshark ट्रेस से, ऐसा लगता है कि सर्वर कोई प्रतिक्रिया शीर्षलेख नहीं भेज रहा है, और सीधे डेटा भेज रहा है। यह एक HTTP प्रोटोकॉल उल्लंघन है। यही कारण है कि ग्राहक अपवाद फेंक रहा है।

+0

कूल साइट ... पहले कभी नहीं देखी गई। उन क्षणों को पोस्ट करेंगे ... – eidylon

+0

हां, tracelog से मैं देख सकता हूं कि सर्वर किसी भी वैध HTTP प्रतिक्रिया शीर्षकों के साथ प्रतिक्रिया नहीं दे रहा है। सर्वर को पहले HTTP प्रतिक्रिया शीर्षलेख भेजना चाहिए और फिर JSON पेलोड भेजना चाहिए। यह समस्या – feroze

+0

है इसके अलावा आपके कोड में एक बग है। आप GetPesponse() को कॉल करने से प्राप्त HttpWebResponse ऑब्जेक्ट का निपटारा नहीं कर रहे हैं। आपको उस ऑब्जेक्ट पर निपटान() को कॉल करने की आवश्यकता है, अन्यथा आप सर्वर से कनेक्शन समाप्त कर देंगे। – feroze

2

यहां यह है कि मैं इसे कैसे काम कर रहा हूं ... सही दिशा में मुझे इंगित करने के लिए धन्यवाद करने के लिए धन्यवाद!
(अंक से सम्मानित किया)

Public Function GetJSON(ByRef d As db.Device) As Boolean 
    Try 
     Dim tcp = New TcpClient() 
     tcp.Connect(d.IpAddress, 80) 

     Dim ns = tcp.GetStream() 

     Dim req As Byte() = System.Text.Encoding.ASCII.GetBytes(
      "GET /getdata.htm HTTP/1.1" & vbCrLf & vbCrLf 
     ) 
     ns.Write(req, 0, req.Length) 

     Dim rsp(2048) As Byte, rcv As Integer 
     Do 
      rcv = ns.Read(rsp, 0, rsp.Length) 
      d.JSON &= System.Text.Encoding.ASCII.GetString(rsp, 0, rcv) 
     Loop Until rcv = 0 

     tcp.Close() 

     Return True 
    Catch ex As Exception 
     Log(ex.Message) 
     Return False 
    End Try 
End Function 
+1

'tcp.Close()' को "अंत में" से बुलाया जाना चाहिए, अन्यथा इसे कॉल नहीं किया जाएगा यदि '.Close()' कॉल से पहले कोई अपवाद है। – sharptooth

+0

@ शार्पतोथ अच्छा बिंदु। – eidylon

1

यह मैं मदद करता है। मुझे उम्मीद है कि यह किसी की भी मदद करता है।

HttpWebRequest ऑब्जेक्ट बनाने के ठीक बाद, इस लाइन को जोड़ें।

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;

इसका क्या मतलब है सुरक्षा प्रोटोकॉल के रूप में सिक्योर सॉकेट लेयर (एसएसएल) 3.0 निर्दिष्ट करता

http://support.microsoft.com/kb/915599

0

अनुरोध की विलंबता की जाँच करें। यदि यह कुछ एमएस से अधिक है तो यह Nagle एल्गोरिथ्म

ServicePointManager.UseNagleAlgorithm = false; 
0

मैं एक शरीर के बिना एक अनुरोध के संबंध में एक ही मुद्दा हो रही थी अक्षम करने के लायक है। मेरे मामले में, ContentLength को ज़ीरो को समस्या को ठीक करने के लिए सेट करना। ": // .. http" के बजाय सेवा पते के रूप में "https: //"

0

मेरे मामले में समस्या हम इस्तेमाल किया था ...