2009-07-03 9 views
0

ich mit meinem Web-Browser auf die Website angemeldet haben und wenn ich versuche,Wie kann ich in C# XML von einer anderen Seite, während lesen angemeldet Standort

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()); 
} 

zu nennen Response.Write gibt mir die Login-Seite zurück.

Gibt es Weg, um Benutzer SessionId an WebClient oder XmlTextReader anzufügen oder wie kann ich eine andere Seite in C# mit dem aktuell angemeldeten Benutzer anfordern?

Antwort

1

Sie müssen ein Objekt verwenden, das mit dem Speichern von Cookies umgehen kann. In diesem Fall benötigen Sie die Klasse HttpWebRequest. Sie benötigen außerdem eine CookieContainer, um Authentifizierungscookies zu verwalten.

Um dies zu tun, würden Sie:

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

Unten ist ein Beispiel dafür, wie die HttpWebRequest zu verwenden, HttpWebResponse und CookieContainer Klassen zusammen, um eine einfache Anfrage zu machen, die einige Cookies, und dann auf eine nachfolgende Anforderung diese Cookies verwenden. 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 die WebClient Klasse verwenden möchten) würde die ResponseHeaders Eigenschaft der Klasse parsen, sobald Sie Ihr gemacht haben fordern Sie an und fügen Sie bei Ihrer nächsten Anfrage die entsprechenden Cookies hinzu. Dies ist jedoch ein wenig komplizierter, da Sie Ihre Cookies manuell verwalten müssen.

Da ich davon ausgehe, dass Sie Ihre Webantworten als XML durchqueren möchten, schlage ich vor, dass Sie in die Open Source-Bibliothek HtmlAgilityPack schauen. Sie können Markup von einer Website senden, die (wahrscheinlich) nicht korrekt formatiert ist, oder ein ungültiges Markup enthält, und dann die ungültigen Teile so korrigieren, dass Sie sie wie XML durchqueren können.

1

Beim Screen Scraping hatte ich das gleiche Problem. Ich habe eine klassische ASP-App auf einem IIS-Server angefordert (ich konnte anhand einiger Header feststellen, dass der Server damit referierte). Die Art, wie ich eine laufende Sitzung unterstützt habe, war die Aktivierung von Cookies auf dem WebClient. Es gibt keinen Schalter dafür, Sie müssen WebClient ableiten, um es zum Laufen zu bringen.

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 es auf dem Netz selbst herausgefunden, aber ich habe die Lösung implementiert und es funktioniert wirklich gut.