web-dev-qa-db-fra.com

Comment soumettre un formulaire http en utilisant C #

J'ai un simple fichier html tel que

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

Edit: je n'ai peut-être pas été assez clair avec la question

Je veux écrire du code C # qui soumet ce formulaire de la même manière que si j'avais collé le code HTML ci-dessus dans un fichier, l'ouvrir avec IE et le soumettre avec le navigateur).

30
JC.

Voici un exemple de script que j'ai récemment utilisé dans une transaction Gateway POST qui reçoit une réponse GET. L'utilisez-vous dans un formulaire C # personnalisé? Quel que soit votre objectif, remplacez simplement les champs String (nom d'utilisateur , mot de passe, etc.) avec les paramètres de votre formulaire.

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;
   } 
30
shanabus

Votre fichier HTML ne va pas interagir directement avec C #, mais vous pouvez écrire du C # pour qu'il se comporte comme s'il s'agissait du fichier HTML.

Par exemple: il existe une classe appelée System.Net.WebClient avec des méthodes 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);
}

Pour plus de documentation et de fonctionnalités, reportez-vous à la page MSDN.

12
Jeff Meatball Yang

Vous pouvez utiliser la classe HttpWebRequest pour ce faire.

Exemple ici :

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>

*/
4
Sklivvz

J'avais besoin d'un gestionnaire de boutons qui a créé un post de formulaire vers une autre application dans le navigateur du client. J'ai atterri sur cette question, mais je n'ai pas vu de réponse adaptée à mon scénario. Voici ce que j'ai trouvé:

      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);
        }
3
JDPeckham
Response.Write("<script> try {this.submit();} catch(e){} </script>");
2
DRiVe

J'ai eu un problème similaire dans MVC (qui m'a conduit à ce problème).

Je reçois un FORM en tant que réponse sous forme de chaîne à partir d'une demande WebClient.UploadValues ​​(), que je dois ensuite soumettre - je ne peux donc pas utiliser un deuxième WebClient ou HttpWebRequest. Cette demande a renvoyé la chaîne.

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

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

Ma solution, qui pourrait être utilisée pour résoudre l'OP, consiste à ajouter une soumission automatique Javascript à la fin du code, puis à utiliser @ Html.Raw () pour le rendre sur une page Razor.

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

Code de rasoir:

@model SomeModel

@{
    Layout = null;
}

@Html.Raw(@Model.rawHTML)

J'espère que cela pourra aider quiconque se retrouve dans la même situation.

1
kangacHASHam