Salve,
sto provando a scrivere un applicazione in C# leggermente più complicato per me e ho riscontrato la mia prima difficolta.
Dovrei scrivere una classe per la lettura delle pagine web, con l'autenticazione.
Io ho scritto questo:
Interfaccia
Classe 1codice:using System; using System.IO; using System.Net; namespace MyApp.Proxy { public interface IProxy { string Referer { get; set; } string UserAgent { get; set; } CookieContainer Cookies { get; set; } StreamReader RequestData(string url); StreamReader RequestData(string url, RequestMethod method); StreamReader RequestData(string url, RequestMethod method, HttpPostData postData); } }
Classe 2codice:using System; using System.IO; using System.Net; using System.Text; using System.Web; using MyApp.Utility; namespace MyApp.Proxy { public enum RequestMethod { Get = 0, Post = 1 } public abstract class Proxy : IProxy { protected string m_referer; protected string m_userAgent; protected CookieContainer m_cookies; public string Referer { get { return m_referer; } set { m_referer = value; } } public string UserAgent { get { return m_userAgent; } set { m_userAgent = value; } } public CookieContainer Cookies { get { return m_cookies; } set { m_cookies = value; } } public Proxy() { m_referer = String.Empty; m_userAgent = "Mozilla/5.0 (X11; U; Linux x86_64; it-it) AppleWebKit/534.26+ (KHTML, like Gecko) Ubuntu/11.04 Epiphany/2.30.6"; m_cookies = new CookieContainer(); } public virtual StreamReader RequestData(string url) { return RequestData(url, RequestMethod.Get); } public virtual StreamReader RequestData(string url, RequestMethod method) { return RequestData(url, method, null); } public virtual StreamReader RequestData(string url, RequestMethod method, HttpPostData postData) { return null; } } public sealed class HttpPostData { private string[] Entries; public string Compiled; public int Length; public HttpPostData(int size) { Entries = new string[size]; Compiled = ""; Length = 0; } public void AddEncoded(int position, string header, string value) { Entries[position] = header + "=" + HttpUtility.UrlEncode(value); } public void Add(int position, string header, string value) { Entries[position] = header + "=" + value; } public string Compile() { Compiled = String.Join("&", Entries); Length = Compiled.Length; return Compiled; } public override string ToString() { return Compile(); } } }
Dopo inizializzo in questo modo la classe:codice:using System; using System.IO; using System.Net; using System.Text; using MyApp.Utility; namespace MyApp.Proxy { public class MyPC : Proxy { private string cookieHeader; public MyPC() : base() { } public override StreamReader RequestData(string url) { return RequestData(url, RequestMethod.Get); } public override StreamReader RequestData(string url, RequestMethod method) { return RequestData(url, method, null); } public override StreamReader RequestData(string url, RequestMethod method, HttpPostData postData) { try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url)); if (method == RequestMethod.Post && postData != null) { postData.ToString(); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postData.Length; using (Stream writeStream = request.GetRequestStream()) { UTF8Encoding encoding = new UTF8Encoding(); byte[] bytes = encoding.GetBytes(postData.Compiled); writeStream.Write(bytes, 0, bytes.Length); } } else { request.Method = "GET"; } if (Referer != String.Empty) request.Referer = m_referer; if (UserAgent != String.Empty) request.UserAgent = m_userAgent; request.Timeout = 60000; request.CookieContainer = m_cookies; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader streamRead = new StreamReader(responseStream, Encoding.UTF8); m_referer = url; return streamRead; } catch (Exception e) { Log.Error(e.ToString()); return null; } } } }
e attraverso POST DATA faccio il login al sito interessato:codice:MyPC m_proxy = new MyPC();
e fino qui ci siamo, il login avviene corettamente.codice:HttpPostData postData = new HttpPostData(6); ... StreamReader reader = m_proxy.RequestData(m_server.Address + "login.php", RequestMethod.Post, postData)
Ma al richiamo di una seconda pagina che si vede solo se si è autenticati, non mi visualizza, ritorna la pagina con avviso di autentificarsi. È come se la classe non memorizza corettamente i cookies neccessari per mantenere i dati dopo l'autenticazione.
Ho già cercato su google, ma non ho trovato nulla che mi aiuti a capire dove faccio lo sbaglio.
Potete aiutarmi per favore.
Grazie.

Rispondi quotando