Obtener el contenido de la respuesta con StatusCode 401
-
19-09-2019 - |
Pregunta
Estoy tratando de establecer una conexión con un servidor que envía 401 Error de autenticación para todas mis solicitudes, junto con la respuesta normal html. p.ej. Sin embargo, también quiero leer la respuesta HTML que se envía alongwith de modo que pueda procesarla. Un intercambio ejemplo cabecera capturado usando LiveHTTPHeaders: Claramente, de longitud de contenido no es cero. Firefox muestra que sea javascript.
https://172.31.1.251:1003/fgtauth?73e285357b2dc5cc
Request:
GET /fgtauth?73e285357b2dc5cc HTTP/1.1
Host: 172.31.1.251:1003
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Response:
HTTP/1.x 401 Unauthorized
WWW-Authenticate: Fortigate
Content-Length: 1091
Connection: Keep-Alive
Cache-Control: no-cache
Content-Type: text/html
En este punto, se abre un formulario en Firefox que me pide que introduzca mi nombre de usuario y contraseña.
https://172.31.1.251:1003/
Request:
POST / HTTP/1.1
Host: 172.31.1.251:1003
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: https://172.31.1.251:1003/
Content-Type: application/x-www-form-urlencoded
Content-Length: 93
magic=73e285357b2dc5cc&username=uuxx&password=xxuu&4Tredir=http%3A%2F%2Fwww.google.com%2F
Response:
HTTP/1.x 401 Unauthorized
WWW-Authenticate: Fortigate
Content-Length: 924
Connection: Keep-Alive
Cache-Control: no-cache
Content-Type: text/html
En este punto estoy redirigidos a otra URL. Sin embargo, el problema que tengo es cómo conseguir que el contenido de longitud 924 que se envía junto con el 401 no autorizado, ya que el contenido me ayudará en hacer lo que quiero hacer más. Pero la misma línea:
WebResponse loginResponse = loginRequest.GetResponse();
Se inicia una excepción.
Yo estaré agradecido por cualquier sugerencia para ayudar a conseguir al contenido real.
Gracias.
Solución
Es necesario leer la propiedad WebException
del Response
, como esto:
WebResponse loginResponse;
try {
loginResponse = loginRequest.GetResponse();
} catch(WebException ex) {
if (ex.Status == WebExceptionStatus.ProtocolError) {
loginResponse = ex.Response;
} else
throw;
}
//Do something with the response, and remember to dispose it.