2012-07-03 13 views
5

पर चल रहा है मुझे एक WebRequest के साथ एक अजीब समस्या या व्यवहार भी मिला है।HttpWebRequest केवल .NET 4.0

Dim req As HttpWebRequest = CType(Net.WebRequest.Create("https://cloud.myweb.de/myenginge/dostuff"), HttpWebRequest) 

Dim inputString As String = "text=DoStuff" 
Dim data As Byte() = System.Text.Encoding.ASCII.GetBytes(inputString) 

req.Method = "POST" 
req.Accept = "application/xml;q=0.9,*/*;q=0.8" 

req.ContentType = "application/x-www-form-urlencoded" 
req.ContentLength = data.Length 

str2 = req.GetRequestStream() 

str2.Write(data, 0, data.Length) 
str2.Close() 

Dim resp As HttpWebResponse = CType(req.GetResponse, HttpWebResponse) 
str = resp.GetResponseStream() 
buffer = New IO.StreamReader(str, System.Text.Encoding.ASCII).ReadToEnd 

लेकिन मेरे संकलन सेटिंग में नेट फ्रेम 3.5 सेट होने में समय समाप्त करने के लिए नेतृत्व करेंगे: फ्रेमवर्क सेट करते समय

str2 = req.GetRequestStream() 

सबसे पहले, यहाँ मैं क्या करने की कोशिश कर रहा हूँ है संस्करण 4.0 काम करता है और सब कुछ किसी भी टाइमआउट मुद्दे के बिना गुजरता है। क्या कोई जानता है कि ऐसा क्यों होता है? मैंने 3.0 की भी कोशिश की, और यह भी काम नहीं किया।

(मैं इस उदाहरण में VB.NET का उपयोग कर रहा है, लेकिन सी # समाधान भी स्वागत है।)

+2

अनुरोध में अंतर क्या है यह देखने के लिए [Fiddler] (http://www.fiddler2.com/fiddler2/) जैसे टूल का उपयोग करें। तकनीकी रूप से, यदि अनुरोध बिल्कुल समान हैं, तो दूरस्थ सर्वर को अलग-अलग तरीकों से प्रतिक्रिया करने में सक्षम होने के लिए अंतर नहीं पता होना चाहिए।या तो कुछ मामूली बिंदुओं में अनुरोध अलग हैं, या अलग-अलग ढांचे एक ही प्रतिक्रिया को दो अलग-अलग तरीकों से संभालने में कामयाब रहे हैं। – mellamokb

+0

ठीक है, मैं फिडलर को पहले चरण में आज़माउंगा। उस संकेत के लिए धन्यवाद – inva

+0

यदि आप 'req.Timeout' को उस समय सीमा से अधिक मान पर सेट करते हैं, तो क्या यह तब काम करता है? फिडलर के लिए +1 हालांकि, कम से कम आप देख सकते हैं कि यह वास्तव में अनुरोध भेज रहा है और यदि इसमें कोई अंतर है। – greg84

उत्तर

2

मेरा अनुमान है आप कुछ अन्य अनुरोध खुला बैठे जिनमें से अभी तक निपटारा नहीं किया गया है। लागू होने पर using कथन का उपयोग करने के लिए अपना कोड अपडेट करें (IDisposable लागू करने वाली किसी भी ऑब्जेक्ट से निपटने पर आपको हमेशा इसका उपयोग करना चाहिए) उदा।

using (var stream = req.GetRequestStream()) 
{ 
    ... 
} 

यह सुनिश्चित करेगा कि सभी धाराएं अगले स्थान पर जाने से पहले विश्वसनीय रूप से बंद हो जाएं।

अद्यतन

यह निश्चित रूप से .नेट फ्रेमवर्क स्विचिंग के साथ कोई समस्या नहीं है, मैं एक छोटे से सांत्वना अनुप्रयोग में अपने कोड सैंडबॉक्स और (इस प्रकार स्पष्ट रूप से एक अलग के लिए अपने URL से स्विच कोड को फिर से लिखा था एक):

Dim request = CType(WebRequest.Create("https://cloud.myweb.de/myenginge/dostuff"), HttpWebRequest) 
Dim data As Byte() = System.Text.Encoding.ASCII.GetBytes("text=DoStuff") 
request.Method = WebRequestMethods.Http.Post 
request.Accept = "application/xml;q=0.9,*/*;q=0.8" 
request.ContentType = "application/x-www-form-urlencoded" 
request.ContentLength = data.Length 
Using inputStream = request.GetRequestStream() 
    inputStream.Write(data, 0, data.Length) 
End Using 

Dim response = CType(request.GetResponse(), HttpWebResponse) 
Dim buffer As String = "" 
Using outputStream = response.GetResponseStream() 
    Using streamReader = New StreamReader(outputStream, System.Text.Encoding.ASCII) 
     buffer = streamReader.ReadToEnd() 
    End Using 
End Using 
Console.WriteLine(buffer) 

और मुझे हर बार एक सफल प्रतिक्रिया मिली। मैंने .NET 4.0 & 3.5 दोनों के तहत एक ही कोड चलाया। यहाँ कैसे प्रत्येक अनुरोध Fiddler के सौजन्य से देखा है:

पोस्ट someurl HTTP/1.1
स्वीकार: application/xml; q = 0.9, /; q = 0.8
सामग्री प्रकार : आवेदन/x-www फार्म-urlencoded
होस्ट: someurl
सामग्री-लंबाई: 12
अपेक्षा: 100-जारी रखने के
कनेक्शन: Keep-Alive

पाठ = DoStuff

+0

मैं अब इसके लिए कोशिश करूँगा, असल में लपेटें ऐसी चीजें आमतौर पर एक अच्छा विचार है। लेकिन जैसा कि मैंने कहा, संस्करण 4.0 कामों का उपयोग करते हुए, लेकिन 4.0 से कम कोई संस्करण अनुरोध भेजता है :( – inva

+0

इस रैपिंग विचार का उपयोग करके मेरी समस्या का समाधान नहीं होता है - मैं यह नहीं समझ सकता कि कोई खुले अनुरोध हैं। यह केवल कोड निष्पादित है ऊपर दिखाया गया है। इसके अलावा मैंने लॉक() कथन (या यहां तक ​​कि Vb.net में सिंकलॉक) का उपयोग करके अपना मुर्गा लपेट लिया है, लेकिन इससे भी मदद नहीं मिलती है। – inva

+0

@inva आप फिर से अपना अंतिम स्टेटमेंट फिर से पढ़ना चाहेंगे lol इसे फिर से लिखें जिस कोड को मैंने अपना जवाब अपडेट किया है और देखता है कि क्या समस्या हल हो जाती है। आपका इंटिटल कोड धाराओं को खुला छोड़ रहा था (यहां तक ​​कि अपवाद के परिणामस्वरूप) जिससे थ्रेड पूल कनेक्शन से बाहर निकल सकता है। क्या यह संभावना है कि यह समस्या सर्वर से आ रही है? क्या आपके पास चीजों के सर्वर पक्ष पर नियंत्रण है? – James

0

मैं ILSpy का उपयोग कर अपने exe फ़ाइलों के आईएल कोड की तुलना करेंगे।
शायद इस स्तर पर एक निरीक्षण आपको एक विचार देता है जहां संस्करणों के बीच चीजें भिन्न होती हैं।