sharp c# webclient

sharp - Cómo llenar formularios y enviarlos con Webclient en C#



web client class c# (6)

Soy nuevo en el uso de las bibliotecas WebClient, HttpResponse y HttpRequest en C #, así que tengan paciencia conmigo, si mi pregunta es confusa de leer.

Necesito crear un WinForm basado en C # que pueda abrir una URL, que está protegida con la autorización básica. Hice esto agregando esto al encabezado, así:

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

¡Hasta ahora tan bueno! Ahora me gustaría llenar un formulario con un número, encuentro el código fuente del sitio y descubro que el nombre es "número". Así que escribo esto:

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

Pero, ¿cómo presento esto? Me gustaría recibir mis "resultados de búsqueda" ...


He encontrado una solución a mi problema. En primer lugar, estaba confundido acerca de algunos de los conceptos básicos de la comunicación http. Esto fue causado por un script en python que escribí, que tiene un enfoque diferente con la comunicación.

Lo resolví generando los datos POST desde cero y abrí el uri, que estaba contenido en la acción de formulario.


La respuesta de BFree funciona muy bien. Sin embargo, una cosa que observaría es que la concatenación de los datos realmente debería estar codificada con url, de lo contrario, tendría problemas con cosas como los signos "=" y "&" dentro de los datos.

La versión de VB.NET, urlencoded y con soporte para UTF-8, se encuentra a continuación (tenga en cuenta que la codificación url requiere una referencia a System.Web.dll, que solo me funcionó después de que cambié de .NET 4 Compact Framework al normal. 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


Probablemente debería estar usando HttpWebRequest para esto. Aquí hay un ejemplo simple:

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


Prueba esto:

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


Publicar un formulario con System.Net.Http.HttpClient y leer la respuesta como una cadena:

var formData = new Dictionary<string, string>(); 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(); }


Ya lo has enviado con UploadValues . La pregunta es: ¿cuál es su "búsqueda de resultados"? ¿Qué devuelve la página? HTML? Si es así, el paquete de agilidad HTML es la forma más fácil de analizar html.