Pregunta

Estoy creando un objeto HttpWebRequest desde otra página aspx para guardar la secuencia de respuesta en mi almacén de datos. La URL que estoy usando para crear el objeto HttpWebRequest tiene una cadena de consulta para generar la salida correcta. Cuando navego a la página utilizando un navegador antiguo, se procesa correctamente. Cuando trato de recuperar la secuencia de salida utilizando HttpWebResponse.GetResponseStream (), representa la comprobación de errores integrada.

¿Por qué se representaría correctamente en el navegador, pero no utilizando los objetos HttpWebRequest y HttpWebResponse?

Aquí está el código fuente:

Código detrás de la página de destino:

protected void PageLoad(object sender, EventsArgs e)
{
   string output = string.Empty;

   if(Request.Querystring["a"] != null)
   {
      //generate output
      output = "The query string value is " + Request.QueryString["a"].ToString();
   }
   else
   {
      //generate message indicating the query string variable is missing
      output = "The query string value was not found";
   }

   Response.Write(output);
}

Código detrás de la página que crea el objeto HttpWebRequest

string url = "http://www.mysite.com/mypage.aspx?a=1";
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url)

//this if statement was missing from original example
if(User.Length > 0)
{
    request.Credentials = new NetworkCredentials("myaccount", "mypassword", "mydomain");
    request.PreAuthenticate = true;
}

request.UserAgent = Request.UserAgent;
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
Stream resStream = response.GetResponseStream();  
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader readStream = new StreamReader(resStream, encode, true, 2000);
int count = readStream.Read(read, 0, read.Length);
string str = Server.HtmlEncode(" ");

while (count > 0)
{
    // Dumps the 256 characters on a string and displays the string to the console.
    string strRead = new string(read, 0, count);
    str = str.Replace(str, str + Server.HtmlEncode(strRead.ToString()));
    count = readStream.Read(read, 0, 256);
}

// return what was found
result = str.ToString();

resStream.Close();
readStream.Close();

Actualización

@David McEwing: estoy creando HttpWebRequest con el nombre completo de la página. La página sigue generando la salida de error. Actualicé el ejemplo de código de la página de destino para demostrar exactamente lo que estoy haciendo.

@Chris Lively: no estoy redirigiendo a una página de error, genero un mensaje que indica que no se encontró el valor de la cadena de consulta. Actualicé el ejemplo del código fuente.

Actualización 1:

Intenté usar Fiddler para rastrear el HttpWebRequest y no se mostró en la ventana del historial de Sesiones Web. ¿Me falta algo en mi código fuente para obtener una solicitud y una respuesta web completas?

Actualización 2:

No incluí la siguiente sección de código en mi ejemplo y fue el culpable el que causó el problema. Estaba configurando la propiedad Credentials de HttpWebRequest con una cuenta de servicio en lugar de mi cuenta de AD que estaba causando el problema.

Actualicé mi código fuente ejemplo

¿Fue útil?

Solución 3

Necesito reemplazar la siguiente línea de código:

request.Credentials = new NetworkCredentials("myaccount", "mypassword", "mydomain");

con:

request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;

Otros consejos

¿Qué servidor web estás usando? Recuerdo que en algún momento de mi pasado cuando hice algo con IIS hubo un problema en el que el redireccionamiento entre http://example.com / y http://example.com/default.asp eliminaron la cadena de consulta.

Tal vez ejecute Fiddler (o un sniffer de protocolo) y vea si está sucediendo algo que no está esperando.

También puedes ver si se pasa el nombre completo de la página. Si lo hace es casi seguro que el problema es arriba.

Opcionalmente, puede intentar usar AllowAutoRedirect propiedad de HttpRequestObject.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top