2009-08-13 2 views
24

У меня есть простой HTML файл, напримерКак отправить форму HTTP, используя C#

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

Edit: я, возможно, не было достаточно ясно, с вопросом

Я хочу писать C# код, который подает этот форма точно так же, как если бы я вклеил выше html в файл, открыл его в IE и отправил его в браузер.

+0

Эта форма должна быть на странице пользователя или что-то, что вы хотите программно воспроизвести? – annakata

+0

Нет, это то, что я хочу воспроизвести программно. –

+0

Я не понимаю ваш вопрос. Вы не можете напрямую отправить форму с кодом на стороне сервера. Представление HTML-формы выполняется на стороне клиента. –

ответ

5

Для этого вы можете использовать класс HttpWebRequest.

Пример 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

Нет, это просто отправляет URL-адрес. Я спрашиваю, как программно построить и отправить форму. –

+0

Это также делает POST (см. WebRequest.Method) – Sklivvz

12

Ваш HTML-файл не будет взаимодействовать с C# напрямую, но вы можете написать некоторые C#, чтобы вести себя так, как будто это был HTML файл.

Например: есть класс называется System.Net.WebClient с простыми методами:

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

Для получения дополнительной документации и обратитесь к MSDN page.

+0

Это не дает такой же ответ, как и при использовании браузера. –

+3

Ваш браузер отправил кучу заголовков. Снимите HTTP-запрос, отправляемый вашим браузером с помощью Fiddler или Firebug. Затем скопируйте эти заголовки, используя свойство client.Headers. –

+0

этот работает как шарм. спасибо нагрузкам Jeff – djack109

23

Вот пример сценария, который я недавно используется в транзакции шлюза Gateway, которая получает ответ GET. Используете ли вы это в пользовательской форме C#? Независимо от вашей цели, просто замените поля String (имя пользователя, пароль и т. Д.) Параметрами из вашей формы.

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

Страница, которую я отправляю, не получает информацию, если я использую этот код. Он работает только при использовании фрагмента html, на который я ссылаюсь. –

+1

@JC: почему именно это решение не работает? Вы не получаете свое «тестовое» значение ввода? Я просто решил решить это самостоятельно, увидев все эти неприемлемые ответы, только чтобы узнать, что я сделал это точно так же, как это сделал shanabus. HttpWebRequest действительно является решением, если вы ищете программно POST для формы. См. Это сообщение для другого примера, по существу делающего то же самое http://www.csharpfriends.com/Forums/ShowPost.aspx?PostID=32254 –

+0

Страница, на которую я отправляю, отправляет ответ на основе ввода. Он отправляет правильный ответ, если я делаю это через браузер. Возможно, это связано с реализацией php, я не знаю. Или, как указано ниже, мне может потребоваться добавить правильные заголовки. –

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

У меня была аналогичная проблема в MVC (который привел меня к этой проблеме).

Я получаю ФОРМУ как ответ строки из запроса WebClient.UploadValues ​​(), который я должен отправить, поэтому я не могу использовать второй WebClient или HttpWebRequest. Этот запрос вернул строку.

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

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

Мое решением, которое может быть использовано для решения OP, является для добавления авто Javascript представить в конец коды, а затем с помощью @ Html.Raw(), чтобы сделать это на странице Razor.

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

Бритва Код:

@model SomeModel 

@{ 
    Layout = null; 
} 

@Html.Raw(@Model.rawHTML) 

Я надеюсь, что это может помочь всем, кто находит себя в той же ситуации.

1

Мне нужно было иметь обработчик кнопки, который создал сообщение формы для другого приложения в браузере клиента. Я приземлился на этот вопрос, но не увидел ответа, который соответствовал моему сценарию. Это то, что я придумал:

 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); 
     } 
Смежные вопросы