Come compilare i moduli e inviarli con Webclient in C #

Sono nuovo nell’usare le librerie WebClient, HttpResponse e HttpRequest in C #, quindi abbi pazienza con me, se la mia domanda è confusa da leggere.

Ho bisogno di build un WinForm basato su C # in grado di aprire un URL, che è protetto con l’authorization di base. Ho fatto questo con l’aggiunta di questo all’intestazione, in questo modo:

using (WebClient wc = new WebClient()) { wc.Headers.Add(HttpRequestHeader.Authorization, "Basic " + Convert.ToBase64String( Encoding.ASCII.GetBytes(username + ":" + password))); } 

Fin qui tutto bene! Ora vorrei compilare un modulo con un numero, trovo il codice sorgente dal sito e scopro che il nome è “numero”. Quindi scrivo questo:

 NameValueCollection formData = new NameValueCollection(); formData["number"] = number byte[] responseBytes = wc.UploadValues(theurl, "POST", formData); string response = Encoding.ASCII.GetString(responseBytes); textBox_HTML.Text = response; 

Ma come posso inviarlo? Mi piacerebbe ricevere i miei “risultati di ricerca” …

Probabilmente dovresti usare HttpWebRequest per questo. Ecco un semplice esempio:

 var strId = UserId_TextBox.Text; var strName = Name_TextBox.Text; var encoding=new ASCIIEncoding(); var postData="userid="+strId; postData += ("&username="+strName); byte[] data = encoding.GetBytes(postData); var myRequest = (HttpWebRequest)WebRequest.Create("http://localhost/MyIdentity/Default.aspx"); myRequest.Method = "POST"; myRequest.ContentType="application/x-www-form-urlencoded"; myRequest.ContentLength = data.Length; var newStream=myRequest.GetRequestStream(); newStream.Write(data,0,data.Length); newStream.Close(); var response = myRequest.GetResponse(); var responseStream = response.GetResponseStream(); var responseReader = new StreamReader(responseStream); var result = responseReader.ReadToEnd(); responseReader.Close(); response.Close(); 

Prova questo:

 using System.Net; using System.Collections.Specialized; NameValueCollection values = new NameValueCollection(); values.Add("TextBox1", "value1"); values.Add("TextBox2", "value2"); values.Add("TextBox3", "value3"); string Url = urlvalue.ToLower(); using (WebClient client = new WebClient()) { client.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); byte[] result = client.UploadValues(Url, "POST", values); string ResultAuthTicket = Encoding.UTF8.GetString(result); } 

Ho trovato una soluzione al mio problema. Prima di tutto ero confuso su alcune delle basi della comunicazione http. Questo è stato causato da uno script python che ho scritto, che ha un approccio diverso con la comunicazione.

L’ho risolto con la generazione dei dati POST da zero e aperto l’uri, che era contenuto nell’azione modulo.

Pubblicazione di un modulo con System.Net.Http.HttpClient e lettura della risposta come stringa:

 var formData = new Dictionary(); formData.Add("number", number); var content = new FormUrlEncodedContent(formData); using (var httpClient = new HttpClient()) { var httpResponse = await httpClient.PostAsync(theurl, content); var responseString = await httpResponse.Content.ReadAsStringAsync(); } 

Lo hai già UploadValues con UploadValues . La domanda è: qual è il tuo “risultato-ricerca”? Cosa restituisce la pagina? HTML? In tal caso, HTML Agility Pack è il modo più semplice per analizzare l’html.

La risposta di BFree funziona alla grande. Una cosa che vorrei notare, però, è che la concatenazione dei dati dovrebbe essere veramente codificata con l’url, altrimenti avresti problemi con cose come i segni “=” e “&” all’interno dei dati.

La versione VB.NET, urlencoded e con supporto UTF-8, è sotto (si noti che url-encoding richiede un riferimento a System.Web.dll, che ha funzionato solo per me dopo essere passato da .NET 4 Compact Framework al normale. NET 4 Framework).

 Imports System.Web Imports System.Net Imports System.IO Public Class WebFormSubmitter Public Shared Function submit(ByVal address As String, ByVal values As Dictionary(Of String, String)) As String Dim encoding As New UTF8Encoding Dim postData As String = getPostData(values:=values) Dim data() As Byte = encoding.GetBytes(postData) Dim request = CType(WebRequest.Create(address), HttpWebRequest) request.Method = "POST" request.ContentType = "application/x-www-form-urlencoded" request.ContentLength = data.Length Dim newStream = request.GetRequestStream() newStream.Write(data, 0, data.Length) newStream.Close() Dim response = request.GetResponse() Dim responseStream = response.GetResponseStream() Dim responseReader = New StreamReader(responseStream) Return responseReader.ReadToEnd() End Function Private Shared Function getPostData(ByVal values As Dictionary(Of String, String)) As String Dim postDataPairList As New List(Of String) For Each anEntry In values postDataPairList.Add(anEntry.Key & "=" & HttpUtility.UrlEncode(anEntry.Value)) Next Return String.Join(separator:="&", values:=postDataPairList) End Function End Class