c# login webclient html-form webrequest

c# - Usar WebClient o WebRequest para iniciar sesión en un sitio web y acceder a los datos



login html-form (2)

Esto es lo que hice y funciona ( crédito ).

Agregue esta clase primero:

namespace System.Net { using System.Collections.Specialized; using System.Linq; using System.Text; public class CookieAwareWebClient : WebClient { public void Login(string loginPageAddress, NameValueCollection loginData) { CookieContainer container; var request = (HttpWebRequest)WebRequest.Create(loginPageAddress); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; var query = string.Join("&", loginData.Cast<string>().Select(key => $"{key}={loginData[key]}")); var buffer = Encoding.ASCII.GetBytes(query); request.ContentLength = buffer.Length; var requestStream = request.GetRequestStream(); requestStream.Write(buffer, 0, buffer.Length); requestStream.Close(); container = request.CookieContainer = new CookieContainer(); var response = request.GetResponse(); response.Close(); CookieContainer = container; } public CookieAwareWebClient(CookieContainer container) { CookieContainer = container; } public CookieAwareWebClient() : this(new CookieContainer()) { } public CookieContainer CookieContainer { get; private set; } protected override WebRequest GetWebRequest(Uri address) { var request = (HttpWebRequest)base.GetWebRequest(address); request.CookieContainer = CookieContainer; return request; } } }

Uso:

public static void Main() { var loginAddress = "www.mywebsite.com/login"; var loginData = new NameValueCollection { { "username", "shimmy" }, { "password", "mypassword" } }; var client = new CookieAwareWebClient(); client.Login(loginAddress, loginData); }

WebRequest acceder a datos restringidos en un sitio web usando WebClient / WebRequest . No hay una API oficial en ese sitio web, así que lo que estoy tratando de hacer es simplemente llenar el formulario HTML y publicar los valores en el servidor, así que estoy conectado.

Intenté esto y esto , pero no parece que las próximas solicitudes hayan iniciado sesión.

El último ejemplo es mucho más atractivo ya que obviamente prefiero WebClient , pero WebRequest hará WebRequest heredado.

De todos modos, en el primer ejemplo, creo que no inició sesión, pero las próximas solicitudes que acceden a los datos privados devuelven una página con un mensaje "Este es contenido solo para miembros".

¿Cómo hacer que un WebClient inicie sesión permanentemente?


HTTP es sin estado. Por lo tanto, no puede WebClient iniciar sesión permanentemente. El concepto de sesión no existe en HTTP. Las tecnologías del lado del servidor, como ASP.NET, simulan un comportamiento con estado mediante el concepto de sesión que utiliza cookies o un parámetro de cadena de consulta que se envía y recibe en cada solicitud. Una vez dicho esto, es posible emular lo que hace un navegador desde WebClient. Si tiene acceso al sitio web, conéctese con las credenciales correctas y capture el tráfico con Fiddler. Luego, asegúrese de que WebClient envíe las cookies correctas, solicite encabezados, cadenas de consulta, etc. exactamente igual que el navegador.