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.
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)?
No estoy seguro de si este es el problema, pero ¿está seguro de cerrar su StreamReader cuando haya terminado? –
Gracias por agregar la captura de pantalla. ¿Retiró la información de Autorización del primer GET en ella o simplemente no incluyó ninguna? –
He eliminado mi respuesta, ya que está claro que no se aplica. –