Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [C#] HttpWebRequest - Cookie

    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.

  2. #2
    Ho provato anche a convertire la mia classe MyPC da HttpWebRequest a WebClient in questo modo:
    codice:
    using System;
    using System.IO;
    using System.Net;
    using System.Text;
    using MyApp.Utility;
    
    namespace MyApp.Proxy
    {
    	public class MyPC : Proxy
    	{
    		private WebClient m_client;
    
    		public MyPC() : base()
    		{
    			m_client = new WebClient();
    		}
    
    		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
    			{
    				m_client.Headers.Clear();
    
    				if (m_userAgent != String.Empty)
    					m_client.Headers.Add("User-Agent", m_userAgent);
    
    				if (m_referer != String.Empty)
    					m_client.Headers.Add("Referer", m_referer);
    
    				m_referer = url;
    
    				if (method == RequestMethod.Post && postData != null)
    				{
    					postData.ToString();
    					m_client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
    
    					Stream memory = new MemoryStream(m_client.UploadData(new Uri(url), Encoding.UTF8.GetBytes(postData.Compiled)));
    					StreamReader reader = new StreamReader(memory, Encoding.UTF8);
    					return reader;
    				}
    				else
    				{
    					m_client.Headers.Add("Content-Type", "text/html");
    					Stream memory = new MemoryStream(m_client.DownloadData(new Uri(url)));
    					StreamReader reader = new StreamReader(memory, Encoding.UTF8);
    					return reader;
    				}
    			}
    			catch (Exception e)
    			{
    				Log.Error(e.ToString());
    				return null;
    			}
    		}
    	}
    }
    Però il risultato non cambia.
    Al richiamo della prima pagina di login con passaggio dei post data. Avviene il login.
    E al secondo richiamo di un altra pagina, mi restituisce che il login non è avvenuto.
    Ho letto su Google che WebClient memorizza in automatico i cookie, ma sembra che ciò non avviene.

    Qualche consiglio?

  3. #3
    Nessuno mi può aiutare?

  4. #4
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Io recentemente ho avuto lo stesso problema che ho risolto cosi :

    codice:
     Dim cookies As New CookieContainer()
            Dim risposta As String = Nothing
    
            Try
    
                ' now post to the login form
                Dim WebRequest As HttpWebRequest = TryCast(Net.WebRequest.Create("http://XXXXXXXXXXX.php"), HttpWebRequest)
                WebRequest.Method = "POST"
                WebRequest.ContentType = "application/x-www-form-urlencoded"
                WebRequest.CookieContainer = cookies
    
                ' write the form values into the request message
                Dim requestWriter As New StreamWriter(WebRequest.GetRequestStream())
                requestWriter.Write("action=login&al=&email=XXXXXXXX@gmail.com&password=XXXXXX")
                requestWriter.Close()
    
                Dim lettore As StreamReader = New StreamReader(WebRequest.GetResponse().GetResponseStream())
    
                ' and read the response
                risposta = lettore.ReadToEnd()
                lettore.Close()
    
    
                risposta = Nothing
    
                'WebRequest.GetResponse().Close()
    
                'Dim c As Net.CookieCollection = cookies.GetCookies(New Uri("http://XXXXXX/"))
    
    
                'For Each cok As Cookie In c
                '    Console.WriteLine(cok.Domain)
                '    Console.WriteLine(cok.Expired)
                '    Console.WriteLine(cok.Name)
                '    Console.WriteLine(cok.Value)
                '    Console.WriteLine(cok.Path)
                '    Console.WriteLine(cok.Comment)
                '    Console.WriteLine(cok.CommentUri)
                '    Console.WriteLine(cok.Expires)
                '    Console.WriteLine(cok.Secure)
                '    Console.WriteLine(cok.Port)
                '    Console.WriteLine(cok.Version)
                'Next
    
    
                ' now we can send out cookie along with a request for the protected page
                WebRequest = TryCast(Net.WebRequest.Create("http://XXXXXXXXXX"), HttpWebRequest)
                WebRequest.CookieContainer = cookies
                WebRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0.1) Gecko/20100101 Firefox/8.0.1"
                WebRequest.AllowAutoRedirect = True
    
                Using responseReader As New StreamReader(WebRequest.GetResponse().GetResponseStream())
                    ' and read the response
                    risposta = responseReader.ReadToEnd()
                    responseReader.Close()
                End Using
    
                Parsing(risposta)
    
    
            Catch ex As Exception
    
            Finally
                cookies = Nothing
            End Try
        End Sub

  5. #5
    Originariamente inviato da cassano
    Io recentemente ho avuto lo stesso problema che ho risolto cosi :

    codice:
     Dim cookies As New CookieContainer()
            Dim risposta As String = Nothing
    
            Try
    
                ' now post to the login form
                Dim WebRequest As HttpWebRequest = TryCast(Net.WebRequest.Create("http://XXXXXXXXXXX.php"), HttpWebRequest)
                WebRequest.Method = "POST"
                WebRequest.ContentType = "application/x-www-form-urlencoded"
                WebRequest.CookieContainer = cookies
    
                ' write the form values into the request message
                Dim requestWriter As New StreamWriter(WebRequest.GetRequestStream())
                requestWriter.Write("action=login&al=&email=XXXXXXXX@gmail.com&password=XXXXXX")
                requestWriter.Close()
    
                Dim lettore As StreamReader = New StreamReader(WebRequest.GetResponse().GetResponseStream())
    
                ' and read the response
                risposta = lettore.ReadToEnd()
                lettore.Close()
    
    
                risposta = Nothing
    
                'WebRequest.GetResponse().Close()
    
                'Dim c As Net.CookieCollection = cookies.GetCookies(New Uri("http://XXXXXX/"))
    
    
                'For Each cok As Cookie In c
                '    Console.WriteLine(cok.Domain)
                '    Console.WriteLine(cok.Expired)
                '    Console.WriteLine(cok.Name)
                '    Console.WriteLine(cok.Value)
                '    Console.WriteLine(cok.Path)
                '    Console.WriteLine(cok.Comment)
                '    Console.WriteLine(cok.CommentUri)
                '    Console.WriteLine(cok.Expires)
                '    Console.WriteLine(cok.Secure)
                '    Console.WriteLine(cok.Port)
                '    Console.WriteLine(cok.Version)
                'Next
    
    
                ' now we can send out cookie along with a request for the protected page
                WebRequest = TryCast(Net.WebRequest.Create("http://XXXXXXXXXX"), HttpWebRequest)
                WebRequest.CookieContainer = cookies
                WebRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0.1) Gecko/20100101 Firefox/8.0.1"
                WebRequest.AllowAutoRedirect = True
    
                Using responseReader As New StreamReader(WebRequest.GetResponse().GetResponseStream())
                    ' and read the response
                    risposta = responseReader.ReadToEnd()
                    responseReader.Close()
                End Using
    
                Parsing(risposta)
    
    
            Catch ex As Exception
    
            Finally
                cookies = Nothing
            End Try
        End Sub
    A dire la verita', non sono riuscito a capire dove sbaglio nel mio codice.
    Con Finally devo azzerare i cookies e passare alla funzione il cookie precedenti o cosa?
    Qualche altro aiutino? Pls.

  6. #6
    Come si comportano i cookies?
    codice:
    request.CookieContainer = m_cookies;
    Sembra che ad ogni pagina, vengono azzerati e non si salvano uno dopo l'altro?

    Se ho capito qualcosa:
    Devo richiamare la pagina di login, effetturare autenticazione.
    Salvare da parte i cookies subito dopo autenticazione.
    Al richiamo di una seconda pagina passare il cookie salvato prima.
    Giusto?

  7. #7
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Esatto devi mantenere viva l'oggetto Cookiecontainer per tutta la durata delel tue richieste, altrimenti perdi il cookie di autenticazione e ti rimanda alla pagina di login.

    Vedi anche il mio esempio.

    Ciao.

  8. #8
    Originariamente inviato da cassano
    Esatto devi mantenere viva l'oggetto Cookiecontainer per tutta la durata delel tue richieste, altrimenti perdi il cookie di autenticazione e ti rimanda alla pagina di login.

    Vedi anche il mio esempio.

    Ciao.
    Si guardando il tuo codice avevo solo notato che mantenevi vivo il cookie, altre differenze non ho notato.

    Ora provo sperando che funzioni.

    Però a questo punto mi sorge un altro dubbio, perchè la classe WebClient non mantiene vivo il cookie visto che ho letto su google che memorizza in automatico i cookie e mantiene viva la sessione. Vedi la mia seconda prova. Non è così?

    Cmq grazie 1000 dell'aiuto...

  9. #9
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Per fare quello che vuoi tu col Webclient devi usare questo

    codice:
    ublic class CookieAwareWebClient : WebClient
        {
    
            private CookieContainer m_container = new CookieContainer();
    
            protected override WebRequest GetWebRequest(Uri address)
            {
                WebRequest request = base.GetWebRequest(address);
                if (request is HttpWebRequest)
                {
                    (request as HttpWebRequest).CookieContainer = m_container;
                }
                return request;
            }
        }

  10. #10
    Ho provato in tutto modi, ma il risultato è uguale.
    Non prende i cookie durante il richiamo della pagina dopo aver effettuato l'accesso.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.