2009-08-13 15 views
24

Tengo un archivo html simple, comoCómo presentar la forma http usando C#

<form action="http://www.someurl.com/page.php" method="POST"> 
    <input type="text" name="test"><br/> 
    <input type="submit" name="submit"> 
</form> 

Editar: Puede que no haya sido lo suficientemente clara la cuestión

Quiero escribir código C#, que presenta este formulario de la misma manera que ocurriría si hubiera pegado el html anterior en un archivo, lo abrí con IE y lo envié con el navegador.

+0

¿Se supone que este formulario está en la página de un usuario o algo que desea reproducir mediante programación? – annakata

+0

No, esto es algo que quiero replicar programáticamente. –

+0

No entiendo tu pregunta. No puede enviar un formulario con el código del lado del servidor directamente. El envío de formularios HTML se realiza desde el lado del cliente. –

Respuesta

5

Puede usar la clase HttpWebRequest para hacerlo.

Ejemplo here:

using System; 
using System.Net; 
using System.Text; 
using System.IO; 


    public class Test 
    { 
     // Specify the URL to receive the request. 
     public static void Main (string[] args) 
     { 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create (args[0]); 

      // Set some reasonable limits on resources used by this request 
      request.MaximumAutomaticRedirections = 4; 
      request.MaximumResponseHeadersLength = 4; 
      // Set credentials to use for this request. 
      request.Credentials = CredentialCache.DefaultCredentials; 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

      Console.WriteLine ("Content length is {0}", response.ContentLength); 
      Console.WriteLine ("Content type is {0}", response.ContentType); 

      // Get the stream associated with the response. 
      Stream receiveStream = response.GetResponseStream(); 

      // Pipes the stream to a higher level stream reader with the required encoding format. 
      StreamReader readStream = new StreamReader (receiveStream, Encoding.UTF8); 

      Console.WriteLine ("Response stream received."); 
      Console.WriteLine (readStream.ReadToEnd()); 
      response.Close(); 
      readStream.Close(); 
     } 
    } 

/* 
The output from this example will vary depending on the value passed into Main 
but will be similar to the following: 

Content length is 1542 
Content type is text/html; charset=utf-8 
Response stream received. 
<html> 
... 
</html> 

*/ 
+0

No, esto solo envía una URL. Estoy preguntando cómo construir y enviar un formulario de forma programática. –

+0

Esto también hace POST (Ver WebRequest.Method) – Sklivvz

12

su archivo HTML no va a interactuar con C# directamente, pero se puede escribir algo de C# se comporte como si fuera el archivo HTML.

Por ejemplo: hay una clase llamada System.Net.WebClient con métodos simples:

using System.Net; 
using System.Collections.Specialized; 

... 
using(WebClient client = new WebClient()) { 

    NameValueCollection vals = new NameValueCollection(); 
    vals.Add("test", "test string"); 
    client.UploadValues("http://www.someurl.com/page.php", vals); 
} 

Para obtener más documentación y las características, consulte la MSDN page.

+0

Esto no tiene la misma respuesta que yo cuando uso el navegador directamente. –

+3

Su navegador envía un montón de encabezados. Detecta la solicitud HTTP que tu navegador envía usando Fiddler o Firebug. Luego, replique estos encabezados utilizando la propiedad client.Heading. –

+0

este funciona como un encanto. gracias cargas Jeff – djack109

23

Aquí es un script de ejemplo que recientemente utilizado en una transacción Gateway POST que recibe una respuesta GET. ¿Estás usando esto en un formulario personalizado de C#? Sea cual sea su propósito, simplemente reemplace los campos de Cadena (nombre de usuario, contraseña, etc.) con los parámetros de su formulario.

private String readHtmlPage(string url) 
    { 

    //setup some variables 

    String username = "demo"; 
    String password = "password"; 
    String firstname = "John"; 
    String lastname = "Smith"; 

    //setup some variables end 

     String result = ""; 
     String strPost = "username="+username+"&password="+password+"&firstname="+firstname+"&lastname="+lastname; 
     StreamWriter myWriter = null; 

     HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url); 
     objRequest.Method = "POST"; 
     objRequest.ContentLength = strPost.Length; 
     objRequest.ContentType = "application/x-www-form-urlencoded"; 

     try 
     { 
     myWriter = new StreamWriter(objRequest.GetRequestStream()); 
     myWriter.Write(strPost); 
     } 
     catch (Exception e) 
     { 
     return e.Message; 
     } 
     finally { 
     myWriter.Close(); 
     } 

     HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse(); 
     using (StreamReader sr = 
     new StreamReader(objResponse.GetResponseStream())) 
     { 
     result = sr.ReadToEnd(); 

     // Close and clean up the StreamReader 
     sr.Close(); 
     } 
     return result; 
    } 
+1

La página a la que estoy enviando no obtiene la información si uso este código. Solo funciona cuando se utiliza el fragmento de html al que hice referencia. –

+1

@JC: ¿por qué exactamente esta solución no funciona? ¿No obtiene el valor de entrada de "prueba"? Solo fui a resolver esto por mi cuenta luego de ver todas estas respuestas no aceptadas solo para descubrir que lo hice exactamente lo mismo que hizo el shanabus. HttpWebRequest es de hecho la solución si está buscando POST programáticamente para un formulario. Vea esta publicación para otro ejemplo que esencialmente hace lo mismo http://www.csharpfriends.com/Forums/ShowPost.aspx?PidID=32254 –

+0

La página que envío envía una respuesta basada en la entrada. Solo envía la respuesta correcta si hago esto a través del navegador. Tal vez tiene que ver con la implementación de php, no sé. O como se menciona a continuación, es posible que deba agregar los encabezados correctos. –

2
Response.Write("<script> try {this.submit();} catch(e){} </script>"); 
1

tuve un problema similar en MVC (que me llevan a este problema).

Recibo un FORMATO como respuesta de cadena desde una solicitud WebClient.UploadValues ​​(), que luego debo enviar, por lo que no puedo usar un segundo WebClient o HttpWebRequest. Esta solicitud devolvió la cadena.

using (WebClient client = new WebClient()) 
    { 
    byte[] response = client.UploadValues(urlToCall, "POST", new NameValueCollection() 
    { 
     { "test", "value123" } 
    }); 

    result = System.Text.Encoding.UTF8.GetString(response); 
    } 

Mi solución, que podría ser utilizado para resolver el OP, es anexar un automóvil Javascript se someten a la final del código, y luego usando @ Html.Raw() para hacerlo en una página de la maquinilla de afeitar.

result += "<script>self.document.forms[0].submit()</script>"; 
someModel.rawHTML = result; 
return View(someModel); 

Código Razor:

@model SomeModel 

@{ 
    Layout = null; 
} 

@Html.Raw(@Model.rawHTML) 

espero que esto puede ayudar a cualquier persona que se encuentra en la misma situación.

1

Necesitaba tener un controlador de botón que creara una publicación de formulario en otra aplicación dentro del navegador del cliente. Llegué a esta pregunta, pero no vi una respuesta que se adaptara a mi situación. Esto es lo que se me ocurrió:

 protected void Button1_Click(object sender, EventArgs e) 
     { 

      var formPostText = @"<html><body><div> 
<form method=""POST"" action=""OtherLogin.aspx"" name=""frm2Post""> 
    <input type=""hidden"" name=""field1"" value=""" + TextBox1.Text + @""" /> 
    <input type=""hidden"" name=""field2"" value=""" + TextBox2.Text + @""" /> 
</form></div><script type=""text/javascript"">document.frm2Post.submit();</script></body></html> 
"; 
      Response.Write(formPostText); 
     } 
Cuestiones relacionadas