2012-03-27 7 views
3

Ich arbeite an einem C# -Projekt, bei dem ich Daten von einer gesicherten Website abrufen muss, die keine API oder Webdienste hat. Mein Plan ist, mich anzumelden, auf die Seite zu gelangen, die ich brauche, und den HTML-Code auszuwerten, um zu den Datenbits zu gelangen, die ich in einer Datenbank speichern muss. Ich teste gerade mit einer Konsolenanwendung, aber diese wird schließlich in eine Azure Service-Busanwendung konvertiert.C# Console/Server Zugriff auf Website

Um zu irgendetwas zu kommen, müssen Sie sich auf ihrer login.cfm-Seite anmelden, was bedeutet, dass ich die Benutzernamen und Passworteingabesteuerelemente auf der Seite laden muss und auf die Absenden-Schaltfläche klicke. Navigieren Sie dann zu der Seite, die ich analysieren muss.

Da ich keinen 'Browser' habe, um für Steuerelemente zu analysieren, versuche ich verschiedene C# .NET-Klassen zu verwenden, um auf die Seite zu gelangen, den Benutzernamen und das Kennwort festzulegen und auf Senden zu klicken, aber nichts scheint zu funktionieren .

Alle Beispiele, die ich betrachten kann, oder .NET-Klassen, die ich überprüfen sollte, die für diese Art von Projekt entwickelt wurden?

Danke!

Antwort

2

die WebClient-Klasse in System.Net Verwenden

Für Persistenz der Session-Cookie Sie eine benutzerdefinierte WebClient-Klasse machen müssen.

#region webclient with cookies 
public class WebClientX : WebClient 
{ 
    public CookieContainer cookies = new CookieContainer(); 
    protected override WebRequest GetWebRequest(Uri location) 
    { 
     WebRequest req = base.GetWebRequest(location); 
     if (req is HttpWebRequest) 
      (req as HttpWebRequest).CookieContainer = cookies; 
     return req; 
    } 
    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     WebResponse res = base.GetWebResponse(request); 
     if (res is HttpWebResponse) 
      cookies.Add((res as HttpWebResponse).Cookies); 
     return res; 
    } 
} 
#endregion 

ein Browser-Add-on wie Firebug oder die Entwicklungs-Tools in Chrome bauten die HTTP-POST-Daten zu erhalten gesendet werden, wenn Sie ein Formular aus. Senden Sie diese POSTs mithilfe der WebClientX-Klasse, und analysieren Sie den Antwort-HTML-Code.

Der schnellste Weg, HTML zu analysieren , wenn Sie bereits wissen, das Format verwendet eine einfache Regex.Match. Wenn Sie also die Aktionen in Ihrem Browser mit den Entwicklungstools durchführen, um Ihre POSTs, URLs und HTML-Inhalte aufzuzeichnen, führen Sie die gleichen Aufgaben mit dem WebClientX aus.

+0

Danke, das war der Weg, den ich suchte. Sobald ich GetWebResponse mache, wie gebe ich Werte in den Benutzernamen und das Passwort ein, um mich einzuloggen? –

+0

@Chris H - Sie rufen diese überschriebenen geschützten Funktionen nicht auf. Was Sie tun müssen, ist die öffentliche Schnittstelle für den WebClient zu lernen. Um einen HTTP-POST wie eine Formularübertragung durchzuführen, wäre die UploadValues-Methode von WebClient. http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx –

+0

Thans wieder, ich habe den vollständigen Code unten gepostet. –

0

Ok, also hier ist der komplette Code um sich auf eine Seite einzuloggen, dann lesen Sie von einer 2. Seite nach dem Login.

class Program 
     { 
      static void Main(string[] args) 
      { 

       string uriString = "http://www.remotesite.com/login.cfm"; 

       // Create a new WebClient instance. 
       WebClientX myWebClient = new WebClientX(); 

       // Create a new NameValueCollection instance to hold some custom parameters to be posted to the URL. 
       NameValueCollection myNameValueCollection = new NameValueCollection(); 

       // Add necessary parameter/value pairs to the name/value container. 
       myNameValueCollection.Add("userid", "myname"); 
       myNameValueCollection.Add("mypassword", "mypassword"); 

       Console.WriteLine("\nUploading to {0} ...", uriString); 
       // 'The Upload(String,NameValueCollection)' implicitly method sets HTTP POST as the request method.    
       byte[] responseArray = myWebClient.UploadValues(uriString, myNameValueCollection); 

       // Decode and display the response. 
       Console.WriteLine("\nResponse received was :\n{0}", Encoding.ASCII.GetString(responseArray)); 

       Console.WriteLine("\n\n\n pausing..."); 
       Console.ReadKey(); 

       // Go to 2nd page on the site to get additional data 
       Stream myStream = myWebClient.OpenRead("https://www.remotesite.com/status_results.cfm?t=8&prog=d"); 

       Console.WriteLine("\nDisplaying Data :\n"); 
       StreamReader sr = new StreamReader(myStream); 
       StringBuilder sb = new StringBuilder(); 

       using (StreamReader reader = new StreamReader(myStream, System.Text.Encoding.UTF8)) 
       { 
        string line; 
        while ((line = reader.ReadLine()) != null) 
        { 
         sb.Append(line + "\r\n"); 
        } 
       } 

       using (StreamWriter outfile = new StreamWriter(@"Logfile1.txt")) 
       { 
        outfile.Write(sb.ToString()); 
       } 

       Console.WriteLine(sb.ToString()); 

       Console.WriteLine("\n\n\n pausing..."); 
       Console.ReadKey(); 

      } 

     } 

     public class WebClientX : WebClient 
     { 
      public CookieContainer cookies = new CookieContainer(); 
      protected override WebRequest GetWebRequest(Uri location) 
      // public override WebRequest GetWebRequest(Uri location) 
      { 
       WebRequest req = base.GetWebRequest(location); 
       if (req is HttpWebRequest) 
        (req as HttpWebRequest).CookieContainer = cookies; 
       return req; 
      } 
      protected override WebResponse GetWebResponse(WebRequest request) 
      { 
       WebResponse res = base.GetWebResponse(request); 
       if (res is HttpWebResponse) 
        cookies.Add((res as HttpWebResponse).Cookies); 
       return res; 
      } 
     }