2012-07-03 22 views
5

Tengo un problema extraño o incluso un comportamiento con una WebRequest. En primer lugar, esto es lo que estoy tratando de hacer:HttpWebRequest solo ejecutándose en .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 

Pero tener el .NET 3.5 Marco set en mi configuración de compilación dará lugar a un tiempo de espera en:

str2 = req.GetRequestStream() 

mientras que la creación del Marco La versión 4.0 funciona y todo pasa sin ningún problema de tiempo de espera. ¿Sabe alguien por que ha ocurrido esto? Intenté 3.0 también, y tampoco funcionó.

(estoy usando VB.NET en este ejemplo, pero C# soluciones también son bienvenidos.)

+2

Utilice una herramienta como [Fiddler] (http://www.fiddler2.com/fiddler2/) para ver cuáles son las diferencias en la solicitud. Técnicamente, si las solicitudes son exactamente idénticas, entonces el servidor remoto no debería saber la diferencia para poder responder de diferentes maneras.O las solicitudes son diferentes en algún punto menor, o los diferentes marcos están manejando la misma respuesta de dos maneras diferentes. – mellamokb

+0

bien, voy a probar Fiddler en un primer paso. Gracias por esa pista – inva

+0

Si estableces 'req.Timeout' en un valor mayor que el tiempo de espera que estás experimentando, ¿funciona entonces? Sin embargo, +1 para el violinista, al menos se puede ver si realmente está enviando la solicitud y si hay alguna diferencia con ella. – greg84

Respuesta

2

Mi conjetura es que hay alguna otra solicitud de estar abierta que no se ha dispuesto hasta el momento. Actualice su código para usar la declaración using donde corresponda (siempre debe usar esto al tratar con cualquier objeto que implemente IDisposable), p.

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

Esto asegurará que todas las transmisiones se cierren de manera confiable antes de pasar a la siguiente.

actualización

Esto definitivamente no es un problema con el cambio de .NET Framework, que su código de espacio aislado en una pequeña aplicación de consola y volver a escribir el código de la siguiente manera (obviamente conmutación a cabo su URL para un diferente uno):

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) 

Y obtuve una respuesta exitosa cada vez. Ejecuté el mismo código en .NET 4.0 & 3.5. Así es como cada solicitud parecía cortesía de Fiddler:

POSTAL someurl HTTP/1.1
Aceptar: application/xml; q = 0,9, /; q = 0,8
Content-Type : application/x-www-form-urlencoded
anfitrión: someurl
Content-Length: 12
Esperar: 100 continúan
conexión: Keep-Alive

texto = DoStuff

+0

Voy a intentar esto por el momento, en realidad envolver tales cosas es generalmente una buena idea. Pero como he dicho, el uso de la versión 4.0 funciona, pero ninguna versión de menos de 4.0 envía la solicitud :( – inva

+0

usando esta idea de envoltura no resuelve mi problema - no puedo entender que haya solicitudes abiertas. Es solo el código ejecutado mostrado arriba. Además, envolví mi polla usando una instrucción lock() (o incluso SyncLock en Vb.net) pero esto tampoco ayudó. – inva

+0

@inva Quizás quieras volver a leer tu última declaración nuevamente lol Re-write it with el código con el que actualicé mi respuesta y veo si eso resuelve el problema. Su código inicial dejaba las secuencias abiertas (incluso en el resultado de una excepción) que puede causar que el grupo de subprocesos se quede sin conexiones para atender. ¿Es posible? que este problema podría provenir del servidor? ¿Tiene control sobre el lado del servidor de las cosas? – James

0

Me gustaría comparar el código IL de tus archivos EXE utilizando ILSpy.
Tal vez una inspección en este nivel le da una idea de dónde las cosas difieren entre las versiones.