2009-08-13 13 views
24

Mam prosty plik HTML, takich jakJak złożyć formularz http za pomocą C#

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

Edit: I nie mogło być wystarczająco jasne, z pytaniem

Chcę napisać kod C#, który podnosi to Formularz w dokładnie taki sam sposób, w jaki wystąpiłby, gdyby wkleiłem powyższy html do pliku, otworzyłem go za pomocą IE i przesłałem z przeglądarką.

+0

czy ten formularz powinien znajdować się na stronie użytkownika lub coś, co chcesz programowo powielić? – annakata

+0

Nie, to jest coś, co chcę replikować programowo. –

+0

Nie rozumiem twojego pytania. Nie możesz przesłać formularza bezpośrednio po kodzie serwera. Przesyłanie formularzy HTML odbywa się po stronie klienta. –

Odpowiedz

5

Możesz użyć klasy HttpWebRequest, aby to zrobić.

Przykład 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

Nie, to po prostu wysyła adres URL. Pytam, jak programowo skonstruować i przesłać formularz. –

+0

To również robi POSTs (zobacz WebRequest.Method). – Sklivvz

12

Twój plik HTML nie będzie wchodzić w interakcje z C# bezpośrednio, ale można napisać niektóre C#, aby zachowywać się tak, jakby był plik HTML.

Na przykład: istnieje klasa o nazwie System.Net.WebClient z prostych metod:

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); 
} 

Więcej dokumentacji i funkcji, patrz MSDN page.

+0

Nie uzyskuje takiej samej odpowiedzi jak ja, gdy bezpośrednio korzystam z przeglądarki. –

+3

Twoja przeglądarka wysyła kilka nagłówków. Powąchaj żądanie HTTP wysyłane przez przeglądarkę przy użyciu Fiddlera lub Firebuga. Następnie zreplikuj te nagłówki, używając właściwości client.Headers. –

+0

ten działa jak urok. dzięki ładunkom Jeff – djack109

23

Oto przykładowy skrypt, który niedawno używane w transakcji POST Gateway, która otrzymuje odpowiedź GET. Czy używasz tego w niestandardowym formularzu C#? Niezależnie od celu, po prostu zastąp pola String (nazwa użytkownika, hasło itp.) Parametrami z formularza.

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

Strona, którą przesyłam, nie otrzymuje informacji, jeśli używam tego kodu. Działa tylko podczas korzystania z odwołanego fragmentu HTML. –

+1

@JC: dlaczego dokładnie to rozwiązanie nie działa? Nie otrzymujesz wartości wejściowej "testowej"? Po prostu rozwiązałem to samo po tym, jak zobaczyłem wszystkie te nieakceptowane odpowiedzi, aby dowiedzieć się, że zrobiłem dokładnie to samo, co zrobił Shanabus. HttpWebRequest jest rzeczywiście rozwiązanie, jeśli szukasz programowo POST do formularza. Zobacz ten post dla innego przykładu, w zasadzie robiąc to samo http://www.csharpfriends.com/Forums/ShowPost.aspx?PostID=32254 –

+0

Strona, którą wysyłam, wysyła odpowiedź na podstawie danych wejściowych. Wysyła tylko właściwą odpowiedź, jeśli robię to za pośrednictwem przeglądarki. Może to ma związek z implementacją php, nie wiem. Lub, jak wspomniano poniżej, może być konieczne dodanie odpowiednich nagłówków. –

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

miałem podobny problem w MVC (który doprowadzi mnie do tego problemu).

Otrzymuję FORMĘ jako odpowiedź łańcuchową z żądania WebClient.UploadValues ​​(), które następnie muszę przesłać - nie mogę więc używać drugiego klienta WebClient lub HttpWebRequest. To żądanie zwróciło ciąg znaków.

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

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

Moje rozwiązanie, które mogłyby być wykorzystane do rozwiązania OP jest, aby dołączyć auto JavaScript przedkłada końcu kodu, a następnie przy użyciu @ Html.Raw(), aby uczynić go na stronie Razor.

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

Kod Razor:

@model SomeModel 

@{ 
    Layout = null; 
} 

@Html.Raw(@Model.rawHTML) 

Mam nadzieję, że to może pomóc każdemu, kto znajdzie się w takiej samej sytuacji.

1

Potrzebowałem obsługi przycisku, która utworzyła formularz do innej aplikacji w przeglądarce klienta. Wylądowałem na to pytanie, ale nie widziałem odpowiedzi, która pasowałaby do mojego scenariusza. Oto, co wymyśliłem:

 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); 
     } 
Powiązane problemy