2011-02-23 26 views
10

Necesito simular HTTP POST programáticamente, es decir, necesito generar una Solicitud con algunas variables POST y luego enviarla a una página.Cómo simular HTTP POST programáticamente en ASP.NET?

Para aclarar, necesito simular el comportamiento de un POST regular, no hacer todo el trabajo programáticamente. Entonces, básicamente, debo completar una Solicitud de la misma forma en que se realizaría si estuviera ocurriendo un formulario POST, y luego enviar el navegador a la página que espera el POST.

Respuesta

19

Aquí hay una manera de hacerlo.

Envía este método la url y los parámetros de nombre/valor en forma de NameValueCollection. El método crea una publicación Http en el punto final y devuelve la respuesta como una cadena.

Por supuesto, dependiendo de qué/por qué lo hace y cuántas veces se llamará este método, quizás haya otras alternativas. Pero hasta que proporcione más información sobre sus necesidades específicas, este método es lo suficientemente bueno.

El método siguiente utiliza Tareas (.NET 4.0) y los métodos asíncronos, por lo que será más rápido que un método síncrono como el siguiente listado de códigos si está haciendo múltiples llamadas en un bucle, por ejemplo.

static string GetWebResponse(string url, NameValueCollection parameters) 
{ 
    var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
    httpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
    httpWebRequest.Method = "POST"; 

    var sb = new StringBuilder(); 
    foreach (var key in parameters.AllKeys) 
    sb.Append(key + "=" + parameters[key] + "&"); 
    sb.Length = sb.Length - 1; 

    byte[] requestBytes = Encoding.UTF8.GetBytes(sb.ToString()); 
    httpWebRequest.ContentLength = requestBytes.Length; 

    using (var requestStream = httpWebRequest.GetRequestStream()) 
    { 
    requestStream.Write(requestBytes, 0, requestBytes.Length); 
    requestStream.Close(); 
    } 

    Task<WebResponse> responseTask = Task.Factory.FromAsync<WebResponse>(httpWebRequest.BeginGetResponse, httpWebRequest.EndGetResponse, null); 
    using (var responseStream = responseTask.Result.GetResponseStream()) 
    { 
    var reader = new StreamReader(responseStream); 
    return reader.ReadToEnd(); 
    } 
} 

también podría utilizar WebClient (es un poco más simple). Este método espera los parámetros colocamos como una cadena de la forma

name1=value1&name2=value2&name3=value3 

etc Por lo tanto, si se utiliza este método, asegúrese de pasar en sus parámetros, como tal, o modificar la implementación de ser como el código de seguridad.

static string HttpPost(string url, string Parameters) 
{ 
    var req = System.Net.WebRequest.Create(url);  

    req.ContentType = "application/x-www-form-urlencoded"; 
    req.Method = "POST"; 
    byte[] bytes = System.Text.Encoding.ASCII.GetBytes(Parameters); 
    req.ContentLength = bytes.Length; 
    System.IO.Stream os = req.GetRequestStream(); 
    os.Write (bytes, 0, bytes.Length); 
    os.Close(); 
    System.Net.WebResponse resp = req.GetResponse(); 
    if (resp== null) 
    return null; 
    var sr = new StreamReader(resp.GetResponseStream()); 
    return sr.ReadToEnd().Trim(); 
} 
+0

Como mencioné en otro comentario, necesito poder hacer un Response.Redirect() regular después de "construir" la solicitud con las variables de POST que necesito. – Farinha

+0

@Farina, luego modifique su pregunta y deje eso en claro. No puede esperar que todos lean todos sus comentarios solo para comprender lo que necesita. –

+0

@Farina, leí el otro comentario y no estoy seguro de entender su requisito, así que por favor tómese el tiempo para explicar lo más claramente posible qué es lo que está tratando de hacer (en su pregunta). Cuando realiza una solicitud http (GET o POST) del otro lado, puede enviarlo a redirigir. En ese caso, necesitas seguir esa redirección. Usted no puede hacer un redireccionamiento usted mismo. –

3

¿Algo como esto?

public string DoFormPost(string Target, string PostData) 
    { 
     //Make a request    
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Target); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.AllowAutoRedirect = false; 

     //Put the post data into the request 
     byte[] data = (new ASCIIEncoding()).GetBytes(PostData); 
     request.ContentLength = data.Length; 
     Stream reqStream = request.GetRequestStream(); 
     reqStream.Write(data, 0, data.Length); 
     reqStream.Close(); 

     //Get response 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     //Output response to a string    
     String result = ""; 
     using (Stream responseStream = response.GetResponseStream()) 
     { 
      using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8)) 
      { 
       result = reader.ReadToEnd(); 
       reader.Close(); 
      } 
      return result; 
     } 
    } 
1

hice esta pregunta en el pasado aquí:

POST a HTML Form programmatically?

Me dirigieron al siguiente enlace, que funcionó muy bien para mí !:

WebClient.UploadValues

+0

Vi ese, pero WebClient es el que está haciendo el POST, y tengo la intención de hacer un Response.Redirect normal() después de que se haya establecido la variable POST. – Farinha

1

No creo que sea fácil hacer lo que quieras, pero puede haber una aceptación ble solución. Aquí están algunas ideas para soluciones:

  • Volver javascript para el navegador junto con el formulario que desea publicar, y tener las JavaScript Es importante el cargo para usted. Esto no es seguro, sin embargo.
  • Si la página de destino está bajo su control, pase datos a través de HttpContext.Current.Items, llame a Transferir, y haga que la página de destino reconozca ese caso especial y lo maneje. Una ventaja del uso de HttpContext.Current.Items es que se borra automáticamente al final de una solicitud, a diferencia del estado de sesión.
  • HttpServerUtility.Execute puede ser útil si desea incrustar resultados de otra página en la página actual. No le permite establecer los datos de publicación de formulario o los parámetros de Solicitud de URL.
  • Ejecute HttpWebRequest como se describe en las otras respuestas, y use Response.Write para devolverlo como la respuesta de su página web. Es posible que también deba proporcionar las credenciales y cookies de autenticación de los usuarios. Consulte HttpWebRequest.Credentials y HttpWebRequest.CookieContainer.
  • Si puede modificar la página de destino para que muestre la misma información si se vuelve a solicitar, puede hacer la HttpWebRequest y seguirla con un redireccionamiento para el navegador.
  • Refactorice el código para que cualquiera de las páginas pueda generar el mismo resultado (por ejemplo, utilizando un UserControl compartido o un WebControl personalizado).
  • El raspado de páginas puede ser útil si la página de destino se encuentra en otro sitio. Realice la solicitud, elimine los resultados y muestre los resultados en su propia página.