Frage

ich mit meinem Web-Browser auf die Website angemeldet haben und wenn ich versuche zu nennen

WebClient myWebClient = new WebClient();
string str = myWebClient.DownloadString("http://localhost/myxml.aspx");
Response.Write(str.ToString());

oder

XmlTextReader reader = new XmlTextReader(url);
while (reader.Read()) {
 Response.Write(reader.ReadOuterXml());
} 

Response.Write gibt mir die Login-Seite.

Gibt es weg Benutzer SessionId zu WebClient oder XmlTextReader zu befestigen oder wie kann ich eine andere Seite in C # mit aktuellen angemeldeten Benutzer anfordern?

War es hilfreich?

Lösung

Sie müssen ein Objekt verwenden, das Speichern von Cookies verarbeiten kann. In diesem Fall müssen Sie die HttpWebRequest Klasse. Sie finden auch eine CookieContainer brauchen verwalten Authentifizierungscookies.

Um dies zu tun, würden Sie:

  1. Erstellen Sie eine CookieContainer Objekt (ein Keksdose), dass Sie den Überblick über den ganzen Umfang von jeder halten kann verlangen, die Sie machen.
  2. Erstellen Sie eine HttpWebRequest, die in die Website anmeldet Sie zugreifen.
  3. Verwenden Sie die CookieContainer Sie in Schritt 1 für jede nachfolgende Anforderung.

Im Folgenden finden Sie ein Beispiel, wie die HttpWebRequest , HttpWebResponse und Cookie Klassen zusammen, um eine einfache Anfrage zu machen, die festgelegt werden einige Cookies und verwenden dann diese Cookies auf einer nachfolgenden Anfrage. Der Rest sollte einfach unter der Annahme alles gut Markup gebildet wird;)

CookieContainer cookieJar = new CookieContainer();

var webRequest = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com");
webRequest.CookieContainer = cookieJar;

var webResponse = webRequest.GetResponse();

using (var reader = new StreamReader(webResponse.GetResponseStream()))
{
    Response.Write(reader.ReadToEnd());
}

var anotherWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com/search?q=stackoverflow.com");
anotherWebRequest.CookieContainer = cookieJar;

webResponse = anotherWebRequest.GetResponse();

Eine weitere Option (wenn Sie wirklich wollen die WebClient Klasse verwenden) wäre, die ResponseHeaders Eigenschaft der Klasse zu analysieren, sobald Sie Ihre Anfrage und umfassen die entsprechenden Cookies in Ihrem nächsten Anforderung gemacht haben. Dies ist ein wenig komplizierter, obwohl, da es erfordert, dass Sie Ihre Cookies manuell verwalten.

Da ich gehe davon aus, dass Sie Ihre Web-Antworten in der Lage sein wollen, wie XML zu durchqueren, ich schlage vor, Sie schauen in die Open-Source-Bibliothek, HtmlAgilityPack . Es ermöglicht Ihnen, in Markup von einer Website zu senden, die (wahrscheinlich) nicht wohlgeformt ist, oder irgendeine Art von ungültigem Markup in ihm hat, und legt dann die ungültigen Teile, so dass Sie es wie XML durchqueren können.

Andere Tipps

Während einige Screen Scraping tun, ich hatte das gleiche Problem. Ich war eine klassische ASP-Anwendung auf einem IIS-Server anfordert (I durch einige der Header, die der Server reponded mit sagen könnte). Die Art, wie ich eine laufende Sitzung unterstützt wurde von Cookies auf dem WebClient ermöglicht. Es gibt keinen Schalter für sie, Sie haben WebClient Unterklasse, um es zu arbeiten.

    public class CookieAwareWebClient : WebClient
    {
        protected CookieContainer _container = new CookieContainer();

        public CookieContainer Cookies
        {
            get { return _container; }
            set { _container = value; }
        }

        protected override WebRequest GetWebRequest(Uri address)
        {
            HttpWebRequest httpRequest = base.GetWebRequest(address) as HttpWebRequest;      

            if (httpRequest.CookieContainer != null)
            {
                if (httpRequest != null)
                {
                    CookieCollection newCookies = 
                        GetUniqueCookies(
                                address
                                ,httpRequest.CookieContainer.GetCookies(address)
                                );
                    foreach (Cookie c in newCookies)
                        httpRequest.CookieContainer.Add(c);
                }
            }
            else
                httpRequest.CookieContainer = this.Cookies;

            return (WebRequest)httpRequest;
        }

Hinweis: Dies ist nicht eine einzigartige Lösung, ich das dort auf dem Netz fand heraus, mich, aber ich habe die Lösung implementiert und es funktioniert wirklich gut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top