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
codice:
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 1
codice:
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();
}
}
}
Classe 2
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;
}
}
}
}
Dopo inizializzo in questo modo la classe:
codice:
MyPC m_proxy = new MyPC();
e attraverso POST DATA faccio il login al sito interessato:
codice:
HttpPostData postData = new HttpPostData(6);
...
StreamReader reader = m_proxy.RequestData(m_server.Address + "login.php", RequestMethod.Post, postData)
e fino qui ci siamo, il login avviene corettamente.
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.