2012-06-11 15 views
13

Estamos utilizando los objetos HTTPWebRequest para realizar solicitudes HTTP a nuestra aplicación y estamos teniendo un problema cuando la solicitud requiere autenticación y hay un proxy transparente (Squid 3.1.10).HTTPWebRequest.GetResponse() falla con solicitudes autenticadas a través de un proxy transparente

string url = "http://www.icode.co.uk/test/auth.php"; 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
request.Credentials = new NetworkCredential("username", "password"); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
Stream stream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(stream); 

MessageBox.Show(reader.ReadToEnd()); 

reader.Close(); 
stream.Close(); 
response.Close(); 

Nuestro código original utilizaba la clase WebClient que presentaba el mismo problema.

La primera vez que se ejecuta este código, muestra el resultado correctamente. Cuando el código se ejecuta una segunda vez, se produce un error en la línea GetResponse() con:

System.Net.WebException was unhandled 
    Message="The server committed a protocol violation. Section=ResponseStatusLine" 
    Source="System" 
    StackTrace: 
     at System.Net.HttpWebRequest.GetResponse() 
     at Dummy.DummyForm.button1_Click(Object sender, EventArgs e) in H:\Trial\Dummy\DummyForm.cs:line 42 
     at ... 

En Windows 7, el reinicio del proceso hace que se recupere y funciona una vez, pero Server 2003 requiere un reinicio completo.

Mirando el network capture, dos solicitudes son idénticos para empezar, la solicitud no autenticado inicial es enviada y las respuestas del servidor, pero las peticiones en su defecto envía la solicitud autenticada segundo en la mitad de la respuesta inicial como si estuviera haciendo caso omiso de la Content-Length encabezado (que es correcto). Luego recibe el resto de la respuesta inicial y falla con el error de protocolo.

Wireshark capture

Parece extraño que el cliente (HTTPWebRequest) no cierra la conexión limpiamente sin embargo.

Cuando el proxy no está en uso (no el puerto 80 o el tráfico interno) las solicitudes funcionan todas como se esperaba. Cuando no hay autenticación, también funciona, ya que solo hace la solicitud única.

Ya reduje el código del problema al mínimo y lo reproduje con el ejemplo de MSDN, pero ¿alguien sabe si esto es un problema conocido o un problema en nuestra configuración (.NET o Squid)?

+0

No estoy seguro de si este es el problema, pero ¿está seguro de cerrar su StreamReader cuando haya terminado? –

+0

Gracias por agregar la captura de pantalla. ¿Retiró la información de Autorización del primer GET en ella o simplemente no incluyó ninguna? –

+0

He eliminado mi respuesta, ya que está claro que no se aplica. –

Respuesta

1

Ya que sólo falla la segunda vez, habría

request.KeepAlive = false; 

hacer una diferencia?

+0

Es [hace] (http://stackoverflow.com/questions/10984264/httpwebrequest-getresponse-failing-with-authenticated-requests-through-a-trans/11190526#comment14393611_10984264) pero soy reacio a usar eso como solución permanente, ya que es más una solución en lugar de una solución para el problema inicial. Lo aceptaré de todos modos – Deanna

0

Creo que la autenticación NTLM (NetworkCredential) no funciona al mismo tiempo con la función de proxy transparente de SQUID. :-(

http://www.squid-cache.org/mail-archive/squid-users/201110/0025.html

Podría probar con otro esquema de autenticación?

+0

No estoy usando la autenticación NTLM. El objeto 'NetworkCredential' es un esquema agnóstico. El proxy no está autenticado en absoluto, solo el recurso HTTP que estamos solicitando, con autenticación básica. – Deanna

0

Intenta autenticar a sí mismo , con

request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password)); 

antes del request.GetResponse();

Esto funcionó para mí. Primero intenté poner toda la cadena yo mismo, ¡lo cual no funcionó!

Cuestiones relacionadas