2012-07-03 28 views
5

Tôi gặp sự cố lạ hoặc thậm chí là hành vi với WebRequest. Trước hết, đây là những gì tôi đang cố gắng để làm:HttpWebRequest chỉ chạy trên .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 

Nhưng có NET Khung 3.5 bộ trong cài đặt biên dịch của tôi sẽ dẫn đến một thời gian chờ trong:

str2 = req.GetRequestStream() 

trong khi thiết Framework Phiên bản 4.0 hoạt động và mọi thứ trôi qua mà không có bất kỳ vấn đề thời gian chờ nào. Có ai biết tại sao điều này xảy ra không? Tôi đã thử 3.0 là tốt, và nó đã không làm việc hoặc.

(Tôi đang sử dụng VB.NET trong ví dụ này, nhưng C# giải pháp cũng được hoan nghênh.)

+2

Sử dụng công cụ như [Fiddler] (http://www.fiddler2.com/fiddler2/) để xem sự khác biệt trong yêu cầu là gì. Về mặt kỹ thuật, nếu các yêu cầu là chính xác giống nhau, thì máy chủ từ xa không nên biết sự khác biệt để có thể phản hồi theo nhiều cách khác nhau.Hoặc là các yêu cầu khác nhau ở một số điểm nhỏ hoặc các khung công tác khác nhau đang xử lý cùng một phản hồi theo hai cách khác nhau. – mellamokb

+0

ok, tôi sẽ thử Fiddler trong bước đầu tiên. Cảm ơn gợi ý đó – inva

+0

Nếu bạn đặt 'req.Timeout' thành giá trị cao hơn thời gian chờ mà bạn đang gặp phải, nó có hoạt động không? 1 cho fiddler mặc dù, ít nhất bạn có thể xem nếu nó thực sự gửi yêu cầu và nếu có bất kỳ sự khác biệt với nó. – greg84

Trả lời

2

tôi đoán là bạn có một số yêu cầu khác ngồi mở mà chưa được xử lý được nêu ra. Cập nhật mã của bạn để sử dụng câu lệnh using nếu có (bạn nên luôn sử dụng mã này khi xử lý bất kỳ đối tượng nào triển khai IDisposable) ví dụ:

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

Điều này sẽ đảm bảo tất cả các luồng đều được đóng chắc chắn trước khi chuyển sang bước tiếp theo.

Cập nhật

này chắc chắn không phải là một vấn đề với chuyển đổi .NET Framework, tôi sandboxed mã của bạn vào một ứng dụng giao diện điều khiển nhỏ và đã viết lại đoạn code như sau (rõ ràng chuyển ra URL của bạn cho một khác nhau một):

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) 

Và tôi đã nhận được phản hồi thành công mọi lúc. Tôi chạy cùng một mã trong cả hai .NET 4.0 & 3.5. Sau đây là cách mỗi yêu cầu có vẻ lịch sự của Fiddler:

POST someurl HTTP/1.1
Chấp nhận: application/xml; q = 0,9, /; q = 0,8
Content-Type : application/x-www-form-urlencoded
Máy chủ: someurl
Nội dung dài: 12
Expect: 100-tiếp tục
kết nối: Keep-Alive

text = DoStuff

+0

Tôi sẽ thử điều này bây giờ, thực sự bao bọc những thứ như vậy thường là một ý tưởng tốt. Nhưng như tôi đã nói, sử dụng phiên bản 4.0 hoạt động, nhưng không có phiên bản nào nhỏ hơn 4.0 gửi yêu cầu: ( – inva

+0

sử dụng ý tưởng gói này không giải quyết được sự cố của tôi - tôi không thể tìm ra rằng có bất kỳ yêu cầu mở nào. hơn nữa tôi đã bọc cock của tôi bằng cách sử dụng một khóa() tuyên bố (hoặc thậm chí SyncLock trong Vb.net) nhưng điều này không giúp quá. – inva

+0

@inva Bạn có thể muốn đọc lại tuyên bố cuối cùng của bạn một lần nữa lol viết lại nó với mã tôi đã cập nhật câu trả lời của tôi và xem liệu nó có giải quyết được vấn đề hay không. Mã đầu tiên của bạn đã để lại các luồng mở (ngay cả khi kết quả của một ngoại lệ) có thể khiến cho hồ bơi chạy ra khỏi các kết nối để phục vụ. vấn đề này có thể đến từ máy chủ? Bạn có quyền kiểm soát phía máy chủ của mọi thứ không? – James

0

tôi sẽ so sánh các mã IL của file exe của bạn sử dụng ILSpy.
Có thể việc kiểm tra ở cấp độ này cung cấp cho bạn ý tưởng về sự khác biệt giữa các phiên bản.

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