[C#]Class hilfe

01/24/2013 07:20 -Zack1959-#1
Guten Tag
Als erste ich bin noch etwas neu in dem bereich C# daher bitte etwas rücksicht nehmen:D

Ich bin derzeit dabei mehere class zu benutzen aber irgent wie geht das nicht:(
Wenn ich z.B. über ein class mich über meiner Http Class auf einer Webseite einlogge.
Wenn ich dann mit dieser Class weiter mache also z.B. ins Profil gehe und dort Userinfos auslse auf der Seite das funktioniert, aber wenn ich dann mit einer andere Class die Userinfos auslesen möchte funktioniert das leider nicht:(, weil ich nicht mehr eingelogt bin:( ich habe mich doch vorher eingelogt.
Aber warum?

Das ist meine Http Class
Ich vermute das müsse eigentlich an ihr liegen da ja alles funktioniert wenn ich nur eine Class benutze und die Http Class aber wenn ich eine zweite nehe funktioniert das alle nicht:(

Code:
public class Http
    {
        public CookieContainer cookieContainer = new CookieContainer();
        public HttpWebRequest myRequest;
        public HttpWebResponse myRes;
        public string Get(string Url)
        {
            myRequest = (HttpWebRequest)HttpWebRequest.Create(Url);
            myRequest.CookieContainer = cookieContainer;
            myRequest.Method = "GET";
            myRequest.ServicePoint.Expect100Continue = false;
            myRequest.AllowAutoRedirect = true;
            myRes = (HttpWebResponse)myRequest.GetResponse();
            StreamReader srprüfen = new StreamReader(myRes.GetResponseStream());
            return srprüfen.ReadToEnd();
        }

        public void Post(string Url, string PostData)
        {
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] data = encoding.GetBytes(PostData);
            myRequest = (HttpWebRequest)WebRequest.Create(Url);
            myRequest.Method = "POST";
            myRequest.CookieContainer = cookieContainer;
            myRequest.AllowAutoRedirect = true;
            myRequest.ServicePoint.Expect100Continue = false;
            myRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/19.0 Firefox/19.0";
            myRequest.ContentType = "application/x-www-form-urlencoded";
            myRequest.ContentLength = data.Length;
            Stream newStream = myRequest.GetRequestStream();
            newStream.Write(data, 0, data.Length);
            newStream.Close();
            myRes = (HttpWebResponse)myRequest.GetResponse();
        }
    }
Hoffe da auf Hilfe Danke
01/24/2013 08:02 Lawliet#2
Cookies speichern und immer bei den Requests mitschicken ;)
01/24/2013 18:06 -Zack1959-#3
Aber in was speichern?
Und wie speichern?
Ich arbeite ja mit zwei Class die verschieden laufen und arbeiten da kann ich ja nicht von der einen die nehmen da sie ja dann auch "leer" ist
01/24/2013 18:42 'Heaven.#4
Code:
public class Http
    {
        public HttpWebRequest myRequest;
        public HttpWebResponse myRes;
        public string Get(string Url)
        {
            myRequest = (HttpWebRequest)HttpWebRequest.Create(Url);
            myRequest.CookieContainer = cook;
            myRequest.Method = "GET";
            myRequest.ServicePoint.Expect100Continue = false;
            myRequest.AllowAutoRedirect = true;
            myRes = (HttpWebResponse)myRequest.GetResponse();
            StreamReader srprüfen = new StreamReader(myRes.GetResponseStream());
            return srprüfen.ReadToEnd();
        }

        public void Post(string Url, string PostData,Cookiecontainer cook)
        {
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] data = encoding.GetBytes(PostData);
            myRequest = (HttpWebRequest)WebRequest.Create(Url);
            myRequest.Method = "POST";
            myRequest.CookieContainer = cook;
            myRequest.AllowAutoRedirect = true;
            myRequest.ServicePoint.Expect100Continue = false;
            myRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/19.0 Firefox/19.0";
            myRequest.ContentType = "application/x-www-form-urlencoded";
            myRequest.ContentLength = data.Length;
            Stream newStream = myRequest.GetRequestStream();
            newStream.Write(data, 0, data.Length);
            newStream.Close();
            myRes = (HttpWebResponse)myRequest.GetResponse();
        }
    }
Jetzt erstellst du dir einfach einen cookiecontainer in deiner form und machst ihn public.
dann kannst du ihn einfach bei jeden request angeben(auch von anderen klassen aus)
01/24/2013 19:03 -Zack1959-#5
@'Heaven.
Danke erst mal werde ich dann testen :D

p.s. bei der Get methode hast du aber den CookieContainer vergessen oder war das absicht?

edit:Habe gerade getest und nee das bring auch nichts:(
Ich bin tortzdem nicht eingelgot:(

Kann es fieleicht daran liegen das ich mit dem Code "Http Http = new Http();"
bzw "User User = new User();" denn CookieContainer leere?
01/24/2013 19:54 Lawliet#6
Quote:
Originally Posted by 'Heaven. View Post
Code:
public class Http
    {
        public HttpWebRequest myRequest;
        public HttpWebResponse myRes;
        public string Get(string Url)
        {
            myRequest = (HttpWebRequest)HttpWebRequest.Create(Url);
            myRequest.CookieContainer = cook;
            myRequest.Method = "GET";
            myRequest.ServicePoint.Expect100Continue = false;
            myRequest.AllowAutoRedirect = true;
            myRes = (HttpWebResponse)myRequest.GetResponse();
            StreamReader srprüfen = new StreamReader(myRes.GetResponseStream());
            return srprüfen.ReadToEnd();
        }

        public void Post(string Url, string PostData,Cookiecontainer cook)
        {
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] data = encoding.GetBytes(PostData);
            myRequest = (HttpWebRequest)WebRequest.Create(Url);
            myRequest.Method = "POST";
            myRequest.CookieContainer = cook;
            myRequest.AllowAutoRedirect = true;
            myRequest.ServicePoint.Expect100Continue = false;
            myRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/19.0 Firefox/19.0";
            myRequest.ContentType = "application/x-www-form-urlencoded";
            myRequest.ContentLength = data.Length;
            Stream newStream = myRequest.GetRequestStream();
            newStream.Write(data, 0, data.Length);
            newStream.Close();
            myRes = (HttpWebResponse)myRequest.GetResponse();
        }
    }
Jetzt erstellst du dir einfach einen cookiecontainer in deiner form und machst ihn public.
dann kannst du ihn einfach bei jeden request angeben(auch von anderen klassen aus)
Sowas gehört doch nicht in die Form ^^
Du musst halt die Cookies speichern.

Ich häng dir mal ne Klasse aus einem meiner Projekte an, die müsste eig. funktionieren:

Code:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;

namespace UnrestrictME
{
    class HttpService // Diese Klasse enthält zwei öffentliche Mehoden, get und post. 
    {
        private CookieCollection _cookieCollection; // nicht öffentliches propertie um die cookies zu speichern
        public CookieCollection CookieCollection // öffentliche propertie um die cookies abzurufen
        {
            get { return _cookieCollection ?? (_cookieCollection = new CookieCollection()); } //wenn die daten gelesen werden wollen, wird geprüft ob _cookieCollection (das private Feld) null ist (mit den "??", null bedeutet das object gibts noch nicht), wenn ja, wird eine eine leere cookie collection zugewiesen, wenn nicht wird sie einfach zurückgegeben
            private set { _cookieCollection = value; } // set
        }
		//Diese properties kann man setzen, wenn man eine instanz der klasse httpservice erstellt
        public bool AllowAutoRedirect { get; set; }  //Darf eine Seite einen einfach auf eine andere seite weiterleiten?
        public string UserAgent { get; set; } // welcher useragent soll verwendet werden? kannst einfach mal googlen
        public string ConnectionGroupName { get; set; } // google
        public string ContentType { get; set; } //google
        public string Accept { get; set; } //google

        public HttpDto Get(String url) //Methode um ein getrequest zu machen, am ende wird ein httpdto zurückgegeben
        {
            var httpDto = new HttpDto(); //httpdto erstellen
            url = ParseUrl(url); //parse url bringt die url ins richtige format
            var webRequest = (HttpWebRequest)WebRequest.Create(url); //webrequest wird erstellt
            webRequest.AllowAutoRedirect = AllowAutoRedirect; // eigenschaften werden gesetzt
            webRequest.UserAgent = UserAgent ?? "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1"; // ist keine useragent zugewiesen, wird der von firefox verwendet
            webRequest.ConnectionGroupName = ConnectionGroupName ?? "keep-aliv"; // ist kein cgn gesetzt wird der standart verwendet
            webRequest.ContentType = ContentType ?? "application/x-www-form-urlencoded"; // "
            webRequest.Accept = Accept ?? @"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; // "
            webRequest.Host = GetHostFromUrl(url); //parsed den host aus der url
            if (CookieCollection != null) // CookieCollection vorhanden?
            {
                var cookieContainer = new CookieContainer(); //cookiecontainer für das request erstellen
                cookieContainer.Add(CookieCollection); // cookiecollection hinzufügen
                webRequest.CookieContainer = cookieContainer; // cookies dem request anhängen
            }
            
            using (var response = (HttpWebResponse)webRequest.GetResponse()) //sendet das request und erwartet die antwort vom server
            {
                using (var responseStream = response.GetResponseStream()) //holt sich den stream
                {
                    using (var responseStreamReader = new StreamReader(responseStream)) // übergibt den stream an einen streamreader für einfaches auslesen
                    {
                        

                        if (response.Cookies.Count != 0) // neue cookies? wenn ja dann
                        {
                            CookieCollection.Add(response.Cookies);   // füge sie der collection hinzu
							httpDto.Cookies.AddRange(response.Cookies.Select(x => x).toList()); // cookies dem dto hinzufügen

                        }
                        var readToEnd = responseStreamReader.ReadToEnd(); //html lesen
                        httpDto.Html = readToEnd; // html dem dto zuweisen
                    }
                }
            }
            return httpDto; // dto zurückgeben
        }


        public HttpDto Post(String url, byte[] postPacket) // methode um ein post request zu senden
        {
            var httpDto = new HttpDto(); // httpdto erstellen
            url = ParseUrl(url); // url ins richtige format bringen
            var webRequest = (HttpWebRequest)WebRequest.Create(url); // request erstellen
            webRequest.Method = "POST"; // Methode post zuweisen
            webRequest.ContentLength = postPacket.Length; // länge des zu sendenen contents zuweisen
            webRequest.AllowAutoRedirect = AllowAutoRedirect; //allowredirect zuweisen
            webRequest.UserAgent = UserAgent ?? "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1";
            webRequest.ConnectionGroupName = ConnectionGroupName ?? "keep-aliv";
            webRequest.ContentType = ContentType ?? "application/x-www-form-urlencoded";
            webRequest.Accept = Accept ?? @"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            webRequest.Host = GetHostFromUrl(url);
            if (CookieCollection != null)
            {
                var cookieContainer = new CookieContainer();
                cookieContainer.Add(CookieCollection);
                webRequest.CookieContainer = cookieContainer;
            }
            using (var requestSteam = webRequest.GetRequestStream()) // request stream um zu senden
            {
                requestSteam.Write(postPacket,0,postPacket.Length); // wir schreiben das zu sendende in den steam
                using (var response = (HttpWebResponse)webRequest.GetResponse()) // rückgabe lesen
                {
                    using (var responseStream = response.GetResponseStream()) // wir vorhin
                    {
                        using (var responseStreamReader = new StreamReader(responseStream)) // same
                        {
                            if (response.Cookies.Count != 0)
                            {
                                CookieCollection.Add(response.Cookies);
								httpDto.CookieCollection.Add(response.Cookies.Select(x=>x).toList());
                            }
                            string readToEnd = responseStreamReader.ReadToEnd();
                            httpDto.Html = readToEnd;
                        }
                    }
                }
            }
            return httpDto;
        }

        private string ParseUrl(string url)
        {
            var toReturn = url.StartsWith("http://") ? url : string.Format("http://{0}", url);//fängt dei url mit http:// an? wenn ja passts, wenn nicht machs hinn
            return toReturn;
        }

        private string GetHostFromUrl(string url)
        {
            var uri = new Uri(url);
            var leftPart = uri.Authority;
            return leftPart;
        }
    }
}



using System;
using System.Collections.Generic;
using System.Net;

namespace UnrestrictME
{
    public class HttpDto // DTO = Data transfer object
    {	// get und set heist einfach nur, dass man der eigenschaft nen wert zuweisen und ihn lesen kann
        public string Html { get; set; } // Das object hat die eigenschaft Html als string, wo im HttpService später der html content reingeschrieben wird
        public List<Cookie> Cookies { get; set; } // Liste der Cookies die im Header gesetzt wurden.
    }
}

Da bekommste ein object mit dem html und den neuen cookies.
01/24/2013 20:08 -Zack1959-#7
Danke aber bei mir gibt es keine
Code:
CookieCollection.Add(response.Cookies.Select(x=>x).toList());
:(
Steht immer eine fehler das mir eine using fehlt:(
01/24/2013 20:16 Lawliet#8
Binde mal Linq ein
01/24/2013 20:20 -Zack1959-#9
Habe ich drinnen
das sind meien Usings hier

Quote:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
using System.ComponentModel;
using System.Data;
using System.Web;
using System.Threading;
using System.Collections;
01/24/2013 20:22 'Heaven.#10
Quote:
Originally Posted by Lawliet! View Post
Sowas gehört doch nicht in die Form ^^
Du musst halt die Cookies speichern.
Ich meinen einen CookieContainer in der Mainform erstellen und den dann immer angeben&nutzen...
01/24/2013 21:36 Lawliet#11
Quote:
Originally Posted by -Zack1959- View Post
Habe ich drinnen
das sind meien Usings hier
Dann musst du mir mal sagen an welcher Stelle der Fehler genau kommt.
Quote:
Originally Posted by 'Heaven. View Post
Ich meinen einen CookieContainer in der Mainform erstellen und den dann immer angeben&nutzen...
Das hab ich schon verstanden, aber sowas gehört nicht in die View Klasse.


Dann schon lieber ne static class, welche als CookieHandler dient.

Code:
static class CookieHandler
    {
        private static CookieCollection cookieCollection;
        public static CookieCollection GetCookieCollection()
        {
            return cookieCollection ?? (cookieCollection = new CookieCollection());
        }
        public static void AddCookie(Cookie cookie)
        {
            if (cookieCollection == null) cookieCollection = new CookieCollection();
            cookieCollection.Add(cookie);
        }
        public static void AddCookies(List<Cookie> cookies)
        {
            if (cookieCollection == null) cookieCollection = new CookieCollection();
            foreach (var cookie in cookies)
            {
                cookieCollection.Add(cookie);
            }
        }
    }
Die Cookies haben ja nichts mit der View zutun.

Mit diesem Beispiel kannst du nun einfach von überall CookieHander.GetCookieCollection() aufrufen und bekommst alle aktuell gespeicherten Cookies.
Über AddCookie und AddCookies kannst du welche hinzufügen.
01/24/2013 22:12 nkkk#12
Quote:
Originally Posted by -Zack1959- View Post
Danke aber bei mir gibt es keine
Code:
CookieCollection.Add(response.Cookies.Select(x=>x).toList());
:(
Steht immer eine fehler das mir eine using fehlt:(

to list wird (wie alle methoden in C#) gross geschrieben.
01/25/2013 06:02 -Zack1959-#13
@nkkk
Das ist nicht das Problem:)
Sonder

Quote:
Fehler 1 "System.Net.CookieCollection" enthält keine Definition für "Select", und es konnte keine Erweiterungsmethode "Select" gefunden werden, die ein erstes Argument vom Typ "System.Net.CookieCollection" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) C:\Users\""\documents\visual studio 2010\Projects\""\""\Class2.cs 64 33 ""

Code:
httpDto.Cookies.AddRange(response.Cookies.Select(x => x).ToList()); // cookies dem dto hinzufügen
in

Code:
public HttpDto Get(String url) //Methode um ein getrequest zu machen, am ende wird ein httpdto zurückgegeben
        {
            var httpDto = new HttpDto(); //httpdto erstellen
            url = ParseUrl(url); //parse url bringt die url ins richtige format
            var webRequest = (HttpWebRequest)WebRequest.Create(url); //webrequest wird erstellt
            webRequest.AllowAutoRedirect = AllowAutoRedirect; // eigenschaften werden gesetzt
            webRequest.UserAgent = UserAgent ?? "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1"; // ist keine useragent zugewiesen, wird der von firefox verwendet
            webRequest.ConnectionGroupName = ConnectionGroupName ?? "keep-aliv"; // ist kein cgn gesetzt wird der standart verwendet
            webRequest.ContentType = ContentType ?? "application/x-www-form-urlencoded"; // "
            webRequest.Accept = Accept ?? @"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; // "
            webRequest.Host = GetHostFromUrl(url); //parsed den host aus der url
            if (CookieCollection != null) // CookieCollection vorhanden?
            {
                var cookieContainer = new CookieContainer(); //cookiecontainer für das request erstellen
                cookieContainer.Add(CookieCollection); // cookiecollection hinzufügen
                webRequest.CookieContainer = cookieContainer; // cookies dem request anhängen
            }
            
            using (var response = (HttpWebResponse)webRequest.GetResponse()) //sendet das request und erwartet die antwort vom server
            {
                using (var responseStream = response.GetResponseStream()) //holt sich den stream
                {
                    using (var responseStreamReader = new StreamReader(responseStream)) // übergibt den stream an einen streamreader für einfaches auslesen
                    {
                        

                        if (response.Cookies.Count != 0) // neue cookies? wenn ja dann
                        {
                            CookieCollection.Add(response.Cookies);   // füge sie der collection hinzu
							httpDto.Cookies.AddRange(response.Cookies.Select(x => x).ToList()); // cookies dem dto hinzufügen

                        }
                        var readToEnd = responseStreamReader.ReadToEnd(); //html lesen
                        httpDto.Html = readToEnd; // html dem dto zuweisen
                    }
                }
            }
            return httpDto; // dto zurückgeben
        }
01/25/2013 09:59 Lawliet#14
Hm, ich weiß nicht ob ich die Klasse mal getestet habe, aber du kannst den Teil durch das ersetzen:
Code:
foreach(var cookie in Response.Cookies){
httpDto.Cookies.Add(cookie);
}
01/25/2013 14:14 -Zack1959-#15
Danke erst mal du meisnt aber
Code:
foreach (Cookie cookie in response.Cookies)
                                {
                                    httpDto.Cookies.Add(cookie);
                                }
:)
Werde es mal testen und melde mich dann wenn es Fehler gibt;)

edit:
Habe liber eien Static Class mit dne Cookies die funktioniert jetzt
Danke euch:D