Προς το περιεχόμενο

C# και WebClient


Evgenios1

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας.

Πως συνδεεσαι σε μια ιστοσελιδα με WebClient? Πχ για να συνδεθω στο insomnia εχω κανει το παρακατω το οποιο δεν δουλευει. Καμια ιδεα?

 

>   public Form1()
       {
           InitializeComponent();
           ServicePointManager.Expect100Continue = false;
           
           NameValueCollection args = new NameValueCollection();
           args.Add("action", "login");
           args.Add("vb_login_username", user);
           args.Add("vb_login_password", pass);
           args.Add("cookieuser", "1");
           
           WebClientPlus wc = new WebClientPlus();
           wc.Proxy = null;
           wc.Headers.Add(HttpRequestHeader.UserAgent, Mozilla);
           webBrowser1.DocumentText =

               Encoding.UTF8.GetString(
           wc.UploadValues("http://www.insomnia.gr/forum/login.php", args));


       }

 

>    public class WebClientPlus : WebClient
   {
       CookieContainer cookie = new CookieContainer();
       protected override WebRequest GetWebRequest(Uri address)
       {
           var req = base.GetWebRequest(address);
           if (req is HttpWebRequest)
               (req as HttpWebRequest).CookieContainer = cookie;
           return req;

       }
       
   }

Δημοσ.

Χμμ... Μεγαλη δουλεια οι webbrosers.

Τεσπα, οποιος αντιμετωπισει το ιδιο προβλημα, να ξερεις οτι ειναι πολυ ασταθεις τα πραματα με τις ιστοσελιδες. Καλυτερα να δουλεψει με HttpWebRequest/Response.

3 tips

1) Πριν κανεις οτι κανεις βαλε αυτη τη property σε false

ServicePointManager.Expect100Continue = false;

 

2) Να δουλεψεις παραλληλα με ενα sniffer

 

3) CookieContainer , επειδη θα τυχει να παρεις κανα GET του τυπου Location = /lala.php?do=boom και το request θα το κανεις στο domain/lala.php?do=boom τα cookie θα ειναι για το /lala.php?do=boom και ετσι θα εχεις προβλημα. Λυση, (ετσι το εκανα εγω) μια baseclass του τυπου

 

>public   class ClientBase_
   {
       private CookieContainer CookieJar;
       private CookieCollection cookicoll;
       public ClientBase_()
       {
           CookieJar = new CookieContainer();
           cookicoll = new CookieCollection();
       }


       protected void SetCookies(CookieCollection coll)
       {
           this.cookicoll.Add(coll);
       }
[b]        protected void RegistUrl(string url)
       {
           var ur = new Uri(url);
           foreach (Cookie item in cookicoll)
           {
               AddCookie(ur, item);
           }
       }[/b]
       protected HttpWebRequest Create(string url)
       {
           HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
           request.Proxy = null;
           request.UserAgent = UserAgent_.Mozilla;
           request.AllowAutoRedirect = false;
           request.KeepAlive = true;
           request.CookieContainer = CookieJar;
           request.Headers.Add(HttpRequestHeader.CacheControl, "max-age=0");

           return request;
       }

       protected void AddCookie(Uri url, Cookie c)
       {
           this.CookieJar.Add(url, c);

       }
       
   }

 

Πριν κανεις το create να κανεις regist την url πχ

...

var url = respo.Headers["location"];

var compUrl =domain+url;

RegistUrl(compUrl);

var req =Create(compUrl);

....

 

Υγ τα cookie θα τα εχεις παρει απο κει που στα δινει.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...