none
WebRequest und Response RRS feed

  • Frage

  • Hallo! Ich baue mir eine URL im Quellcode zusammen. Dann möchte ich den Quellcode der Seite haben:

    WebRequest webRequest = WebRequest.Create(url);
    
    WebResponse webResponse = webRequest.GetResponse();
    
    StreamReader sr = new StreamReader(webResponse.GetResponseStream(), Encoding.Default);
    
    string content= sr.ReadToEnd();

    Es kommt jedoch ein anderer Quellcode zurück, als wenn ich die url nehme und im Browser einfüge und von dem die Daten holen lasse (und dann Quellcode anzeigen).

    Wie ist so etwas möglich?

    Danke für die Hilfe!

    Sonntag, 6. März 2011 15:52

Antworten

  • Hallo D.,

    die von mir erwähnte Click-Methode scheint schon mal das gewünschte Ergebnis zu ergeben:

      string webAdresse = "http://www.DeineWebAdresse......"
      string druckButtonName = "cmdImageButton(70070)";
    
      private void Form1_Load(object sender, EventArgs e)
      {
       webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;
       webBrowser1.Navigate(webAdresse);
      }
      bool clickAusgeführt = false;
    
      void WebBrowser1_DocumentCompleted(object sender, 
         WebBrowserDocumentCompletedEventArgs e)
      {
       if (clickAusgeführt) return;
       var htmlDruckButton = webBrowser1.Document.
         GetElementById(druckButtonName);
       htmlDruckButton.InvokeMember("Click");
       clickAusgeführt = true;
      }


    ciao Frank

    • Als Antwort markiert DulcineaS Freitag, 18. März 2011 23:11
    Dienstag, 15. März 2011 18:25
  • Hallo!

    InvokeScript löst das Problem.

    Vielen Dank für die Hilfe!

    • Als Antwort markiert DulcineaS Sonntag, 17. April 2011 21:06
    Sonntag, 17. April 2011 21:05

Alle Antworten

  • Hi,
    Es kommt jedoch ein anderer Quellcode zurück, als wenn ich die url nehme und im Browser einfüge und von dem die Daten holen lasse (und dann Quellcode anzeigen).

    wie ich in deinem anderen Thread bereits geschrieben hatte, solltest Du den Traffic bspw. mit Fiddler überprüfen und den dann identisch nachbauen.

    In deinem Fall könnte es an vielen Sachen liegen. Fehlender UserAgent, akzeptierte Sprachen, sonstige Header, ...

    BTW: HttpWebRequest und HttpWebResponse wären besser geeignet.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Sonntag, 6. März 2011 19:03
    Moderator
  • Hallo!

    Habe jetzt aus Fiddler alles was unter "Request Headers" steht (ausser Cookies" übernommen, aber ich bekomme immer noch nicht den richtigen response.

    Hoffe auf Eure Hilfe. Hier mein Quellcode:

     

    HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
          WebHeaderCollection myWebHeaderCollection = myHttpWebRequest.Headers;
          myWebHeaderCollection.Add("Accept-Language:de ");
          myWebHeaderCollection.Add("Accept-Encoding: gzip, deflate ");
          myWebHeaderCollection.Add("Pragma:no-cache ");
         
          myHttpWebRequest.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, */*";
          myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
          myHttpWebRequest.Referer = "http://www.abcdef.de/content/cost.htm?txtAction=2";
          myHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; BTRS31753; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)";
          myHttpWebRequest.KeepAlive = true;
          myHttpWebRequest.Host = "www.abcdef.de";
          
    
    
          HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
    

     

     

    Sonntag, 6. März 2011 20:47
  • Hi,

    Habe jetzt aus Fiddler alles was unter "Request Headers" steht (ausser Cookies" übernommen, aber ich bekomme immer noch nicht den richtigen response.

    dann probier bitte noch, diese auch zu senden. Wenn es dann immer noch nicht klappt, wäre es hilfreich, wenn Du uns zum einen sagen könntest, inwieweit sich die Rückgabe überhaupt unterscheidet (nur kleine Änderungen, bspw. Css, Html, ... oder ganz was anderes). Die Url zum testen wäre auch sinnvoll, denn ohne die kann man nur mutmaßen.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Sonntag, 6. März 2011 20:59
    Moderator
  • Haloo Stefan, ich soll probieren, diese auch zu senden? Wie meinst du das? Grüße!
    Montag, 7. März 2011 15:33
  • Haloo Stefan, ich soll probieren, diese auch zu senden? Wie meinst du das? Grüße!

    Du hast geschrieben, dass Du alles außer die Cookies gesendet hast. Also sende diese dann bitte noch mit.

    Ansonsten wäre es hilfreich, wenn Du auf die anderen Hinweis auch eingehen würdest.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Montag, 7. März 2011 15:46
    Moderator
  • Hallo!

    Ich erwarte eigentlich eine Seite mit einem eingebettetem Dokumnet, aber es kommt immer nur die alte Seite mit dem Hinweis auf einen Bedienungsfehler.

    Ich habe die Cookies übertragen, aber es geht immer noch nicht. Leider kann ich die URL nicht renstellen, da es sich mitunter um Zugangsdaten handelt.

    Mano...

     

    Montag, 7. März 2011 18:33
  • <script type="text/javascript"></script> <form id="mainform" onkeydown="FunctionKey( event );" action="https://www.mywebsite.de/content/first.htm" enctype="application/x-www-form-urlencoded" method="post">

     Hallo! Vielleicht hilft ein klainer Aussschnitt aus dem HTML-Document:

    <form id="mainform" name="AWGSOB" action="https://www.mypage.de/content/first.htm" method="POST" onsubmit="resetTimer()" target="yoursite" onkeydown="FunctionKey( event );">
    <input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="acc0166a499"><input type="hidden" name=txtAction value="89">
    <input type="hidden" name=method value="">
    <input type="hidden" name=getColumn value="">
    <input type="hidden" name=searchNextPage value="">

    Ich möchte genau die nachfolgende Page laden, die den obigen Token besitzt. Dieser ändert sich jedesmal. Wenn ich im Browser die zusammengesetzte Url (die den Token beinhaltet) eingebe, so wird die korrekte Seite angezeigt. Mache ich das per HttpWebrequest, so geht das nicht (ich bekomme die alte Seite mit einem neuen Token). Wenn ich das WebBrowser-Control  benutze, und die URL mit dem Token übergebe, so bekomme ich die gewollte Seite nicht angezeigt.

    Hoffe auf paar Tips...

    Montag, 7. März 2011 19:27
  • Hi,

    <form id="mainform" name="AWGSOB" action="https://www.mypage.de/content/first.htm " method="POST" onsubmit="resetTimer()" target="yoursite" onkeydown="FunctionKey( event );">
    <input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="acc0166a499"><input type="hidden" name=txtAction value="89">
    <input type="hidden" name=method value="">
    <input type="hidden" name=getColumn value="">
    <input type="hidden" name=searchNextPage value="">

    in deinem Code fehlt ja die gesamte Übergabe der Form Parameter.

    Dim Data As String = "org.apache.struts.taglib.html.TOKEN=acc0166a499&txtAction=89&..."

        myHttpWebRequest.GetRequestStream().Write( System.Text.Encoding.Default.GetBytes( Data ), 0, Data.Length )
        myHttpWebRequest.GetRequestStream().Close()

        myHttpWebRequest.ContentType = "application/x-www-form-urlencoded"

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Montag, 7. März 2011 19:47
    Moderator
  • Hallo D.,

    ich darf mich kurz einschalten ... und kurz in C# Code antworten, weil ich ein einfaches Projekt für ein "POST-Demo-Download einer Datei" als Code-Beispiel in meinen Downloads habe:   http://Dzaebel.NET/Downloads/WebFileDemo.zip

    Der Aufruf in der Windows-Forms-Demo sieht etwa so aus:
    (Beachte ggf. das UTF8Encoding beim Request, trotz Default-Encoding bei der Response.)

    using System;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WinFileTest
    {
     public partial class Form1 : Form
     {
     public Form1()
     {
     InitializeComponent();
     }
    
     private void btnTest_Click(object sender, EventArgs e)
     {
     string antwortText = "";
    
     try
     {
     const int zehnSekunden = 10 * 1000;
     string url = txtURL.Text; //http://localhost:1356/DemoDownload.aspx
     HttpWebRequest anfrage = (HttpWebRequest)WebRequest.Create(url);
     anfrage.Method = "POST";
    
     string deinParameterWert = "Der Wert des Parameters mit Umlaut 'ä'.";
     string postDaten = "eingabe=" + deinParameterWert;
     Encoding encoding = Encoding.UTF8;
     byte[] bytes = encoding.GetBytes(postDaten);
     anfrage.Timeout = zehnSekunden;
     anfrage.UserAgent = "Mein Beispiel-Download";
     anfrage.ContentType = "application/x-www-form-urlencoded";
     anfrage.ContentLength = bytes.Length;
     Stream stream = anfrage.GetRequestStream();
     stream.Write(bytes, 0, bytes.Length);
     stream.Close();
     HttpWebResponse antwort = (HttpWebResponse)anfrage.GetResponse();
     Encoding standardEncoding = Encoding.Default;
     StreamReader antwortStream = new StreamReader(
      antwort.GetResponseStream(), standardEncoding);
     antwortText = antwortStream.ReadToEnd();
     antwort.Close(); antwortStream.Close();
     }
     catch (Exception exp)
     {
     MessageBox.Show(exp.Message, "Fehler", MessageBoxButtons.OK);
     return;
     }
     MessageBox.Show(antwortText);
     }
     }
    }
    
    

    [Gewusst wie: Senden von Daten mit der WebRequest-Klasse]
    http://msdn.microsoft.com/de-de/library/debx8sh9.aspx


    ciao Frank
     
    Montag, 7. März 2011 21:32
  • ich darf mich kurz einschalten ... und kurz in C# Code antworten

    Ich brauch echt ein neues Feature im Forum "Code passt nicht zur Forenkategorie" oder ähnliches :)

    Wobei der TE die 4 Zeilen (von denen bei dreien nur ein ; fehlt) auch selbst übersetzt bekommen sollte.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Montag, 7. März 2011 21:53
    Moderator
  • Hallo Stefan,

    ja, vielleicht ein kurzer Blick nach oben in die URL, wenn da **Csharp drin steht ... kann sicher nicht schaden ;-) aber no prob, natürlich ist das leicht nach C# übersetzt und auch (so übersetzt) dann auch richtig in der fachlichen Essenz - wem sage ich das ... Eigentlich kann man das ja auch einfach editieren und gut :-) 

    BTW: Mein Beispiel-Download ist im Endeffekt ja ähnlich, spricht nur noch die möglichen Encoding-Thematiken an und ist als Beispiel dann auch mal ausprobierbar und man lernt die ASP.NET Seite auch mal kennen und kann die Client-Anfrage debuggen.


    ciao Frank
    Montag, 7. März 2011 22:25
  • Hallo! Habe jetzt ein Besipiel gefunden und würde gerne an diesem Beispiel wissen wie man folgendes macht. Hier noch einmal die Beschreibung meines Problems: Ich möchte den Inhalt (Quellcode) einer Seite bekommen, die normalerweise im Browser nur über einen bestimmten Button ereichbar ist. Als Besipiel soll hier z.B. die Seite http://www.gls-group.eu/ dienen. Wenn man oben im Eingabefeld "Suchen" eine Zahl eintippt und nach deiser sucht, erscheint eine Seite mit Buttons. Diese sind zwar ausgegraut, weil eine korrekte Zahl eingegeben werden muss, aber egal. Ich möchte jetzt den Klick des Buttons "Druck" simulieren. Ich habe mir den Quellcode der Seite aneschaut. Um den Klick zu simulieren muss man wohl dem Request eine Reihe von Parametern mitgeben. Kann man im Quellcode der Seite erkenen, was man übergeben muss? Vielen Dank für die Hilfe!
    Samstag, 12. März 2011 11:55
  • Hi,
    Ich habe mir den Quellcode der Seite aneschaut. Um den Klick zu simulieren muss man wohl dem Request eine Reihe von Parametern mitgeben. Kann man im Quellcode der Seite erkenen, was man übergeben muss?

    bedingt kann man das. Jedes Formularelement muss gesendet werden, ggfs. auch Sessioncookies (die Du aber nicht im Quelltext siehst). Wenn per Clientskript noch Parameter zusammengestellt werden, kannst Du das so aber nicht direkt sehen.

    Aber zum einen wurde das schon beschrieben, zum anderen ist Fiddler (oder auch FireBug) hier hilfreicher, da der dir genau anzeigt, was vom Browser wie gesendet wird. Genau das musst Du dann nachbauen. Wie das geht, zeigen die Beispiele von Frank und mir.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Samstag, 12. März 2011 12:15
    Moderator
  • Hallo D.,

    • ... ich möchte jetzt den Klick des Buttons "Druck" simulieren.

    das Click auszulösen kann ggf. recht einfach sein - es kommt etwas darauf an - das Bestimmen des HtmlElement'es ist oft ein wenig "variabel", wenn es zum Beispiel keine ID für das Element gibt.

    Ich hatte vor 4 Jahren mal ein Beispiel gemacht ... ich poste es mal trotzdem, obwohl es sicher nicht funktioniert, aber es verdeutlicht ganz gut, wie der Click ausgelöst werden kann:
    (hier wird die MSHTML.dll unter Verweisen benutzt)

    // Beispiel für automatischen Web-Umsatz-Download bei der Postbank: 
    // (4 Jahre altes ungeprüftes Beispiel)
    // MSHMTL.dll einbinden!<br/>
    void webBrowser1_DocumentCompleted(object sender, 
     WebBrowserDocumentCompletedEventArgs e) 
    { 
     WebBrowser wb = (WebBrowser)sender; 
     string absUri = e.Url.AbsoluteUri.ToLower(); 
     if (absUri != wb.Url.AbsoluteUri.ToLower() && 
      absUri != (wb.Url.AbsoluteUri.ToLower() + "/")) 
      return; // ggf. für Frame-Ausfilterung 
    
    
     switch (stelle) 
     { 
     case Stelle.AnfangsNavigationURL: 
      HtmlElement elKontoNr = webBrowser1.Document. 
       All[Props.Kontonummer]; 
      elKontoNr.InnerText = PropSets.Kontonummer; 
    
    
      HtmlElement elPIN = webBrowser1.Document. 
       All[Props.PIN]; 
      elPIN.InnerText = PropSets.PIN; 
    
    
      HTMLInputElementClass btn = FindInputTagWithClass( 
       Props.AnmeldenClass, Stelle.Anmeldung); 
      stelle = Stelle.Anmeldung; btn.click(); 
      break; 
    
    
     case Stelle.Anmeldung: 
      HTMLAnchorElementClass anch = FindAnchorWithHref( 
       Props.KontoumsatzHrefStart, Stelle.Kontoumsatz); 
      stelle = Stelle.Kontoumsatz; anch.click(); 
      break; 
    
    
     case Stelle.Kontoumsatz: 
      HTMLAnchorElementClass anch2 = FindAnchorWithText( 
       Props.KontoumsatzDownloadText, Stelle.KontoumsatzDownload); 
      stelle = Stelle.KontoumsatzDownload; 
      WebClient wcl = new WebClient(); 
      wcl.DownloadFile(anch2.href, Path.Combine( 
       Props.DownloadVerzeichnis, Props.KontoUmsatzDateiname)); 
      AnzeigeAusUmsatzDatei(); 
      break; 
    
    
     case Stelle.KontoumsatzDownload: 
      break; 
     } 
    } 
    
    
    private HTMLAnchorElementClass FindAnchorWithHref(string href, 
     string stelle) 
    { 
     foreach (HtmlElement link in webBrowser1.Document.Links) 
     { 
     HTMLAnchorElementClass anchor = link.DomElement as 
      HTMLAnchorElementClass; 
     if (anchor != null && anchor.href.StartsWith(href)) 
      return anchor; 
     } 
     BenachrichtigeFehler(stelle, 
      "Keinen Link mit HREF=\"{0} ...\" gefunden!", href); 
     return null; 
    } 
    
    
    private HTMLAnchorElementClass FindAnchorWithText(string text, 
     string stelle) 
    { 
     foreach (HtmlElement link in webBrowser1.Document.Links) 
     { 
     HTMLAnchorElementClass anchor = link.DomElement as 
      HTMLAnchorElementClass; 
     if (anchor != null && anchor.innerText != null && 
      anchor.innerText.StartsWith(text)) 
      return anchor; 
     } 
     BenachrichtigeFehler(stelle, 
      "Keinen Link mit Text=\"{0} ...\" gefunden!", text); 
     return null; 
    } 
    
    
    private HTMLInputElementClass FindInputTagWithClass(string className, 
     string stelle) 
    { 
     HtmlElementCollection elInputs = webBrowser1.Document. 
      GetElementsByTagName("Input"); 
     foreach (HtmlElement elem in elInputs) 
     { 
     HTMLInputElementClass btn = elem.DomElement as 
      HTMLInputElementClass; 
     if (btn == null) continue; 
     IHTMLDOMAttribute an = btn.getAttributeNode("class"); 
     if (an != null && an.nodeValue != null && 
      an.nodeValue.ToString() == className) 
     { 
      btn.click(); return btn; 
     } 
     } 
     BenachrichtigeFehler(stelle, 
      "Keine <INPUT class=\"{0}\"> gefunden!", className); 
     return null; 
    } 
    
    
    private void BenachrichtigeFehler(string stelle, 
     string message, string parameter) 
    { 
     MessageBox.Show("Bei Stelle " + stelle + ":\r\n" + 
     String.Format(message, parameter), "Fehler bei " + stelle, 
     MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
    } 
    
    

    Man sieht, es ist letztlich nur ein einfach Click() Aufruf.
    Die URL beim Druck Deiner Zahl (mal als Beispiel 1) wäre ja zum Beispiel:
    http://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/NL99/EN/5001.htm?txtAction=71000&txtQuery=1

    Der Print-Button wäre dort:
        <img class="imagebutton" src="images/btn_70190_en_disabled.gif" complete="complete"/>

    Wenn Du im Internet Explorer 8 zum Beispiel F12 drückst, kannst Du dort im Menü "Suchen/Element mit Klicken auswählen" schnell die Struktur und das HTML für das Element einsehen. 


    ciao Frank
    Samstag, 12. März 2011 19:44
  • Hallo Frank,

    wenn man wie der OP mit HttpWebRequest, HttpWebResponse arbeitet (was in den meisten Fällen auch sinnvoller ist als das WebBrowser Control zu mißbrauchen, es sei denn, man will das, was man da ausliest, auch gleich wieder anzeigen), gibt es weder Click, noch GetElementById, DomElement, ...

    Wenn überhaupt, sollte man dann ggfs. mit dem HtmlAgilityPack arbeiten. Aber auch das brauchts hier nicht. Einmal mit Fiddler schauen, was gesendet wird, das nachbauen und gut ist.

    @Dulcinea: Wenn Du damit noch Probleme hast, sag uns doch einfach, womit genau. Damit kann man dann besser helfen.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Samstag, 12. März 2011 20:50
    Moderator
  • Hallo Stefan,

    du hast das wohl mißverstanden. Das Beispiel dient mehr der Erklärung von dem Auslösen des Clicks. Nämlich mit der Click-Methode und das ist auch sauber und empfehlenswert.
    Man "braucht" nicht das WebBrowser Control - (und es wäre auch keine gute Praxis, dies über das WebBrowser Control zu mißbrauchen) eine Erklärung, wie man es ohne machen kann, ist auch in meinem (scheinbar von Dir nicht gelesenen) MSHTML Link enthalten. Aber auch das braucht man nicht in der Form benutzen. Es gibt viele weitere gute Möglichkeiten.
    Ich mache solche Sachen aber seit Jahren auch eher mit dem AgilityPack, oder selten mit anderen HTML-Parsern, je nach Striktheits-Anforderung (was hier allerdings "zum Teil" ein Nachteil gegenüber Browser-Engines ist).

    • ... gibt es weder Click, noch GetElementById, DomElement, ...

    hier muss ich Dir widersprechen - die DOM-Elemente sind im Stream "codiert", man muss sie nur transformieren / parsen und kann dann beliebig GetElementByID etc. benutzen, wenn das DOM gebildetet ist. Auch andere Frameworks / Parser sind nutzbar - die diese GetElement-Methoden wrappen und zur Verfügung stellen.

    • ... Einmal mit Fiddler schauen, was gesendet wird

    wie gesagt, ich denke mein Vorschlag mit F12 ist hier einfacher, um das Element auszumachen - Fiddler ist aber in vielen Szenarien immer ein gern gesehenes Tool (und für die Header etc. in diesem Fall sehr hilfreich) und da wir bei uns auch übewiegend ASP.NET / Silverlight machen, z. B. auch oft eingesetzt.


    ciao Frank

    Samstag, 12. März 2011 21:21
  • Hallo Frank,
    • ... gibt es weder Click, noch GetElementById, DomElement, ...

    hier muss ich Dir widersprechen - die DOM-Elemente sind im Stream "codiert", man muss sie nur transformieren / parsen und kann dann beliebig GetElementByID etc. benutzen, wenn das DOM gebildetet ist. Auch andere Frameworks / Parser sind nutzbar - die diese GetElement-Methoden wrappen und zur Verfügung stellen.

    wenn ich einen entsprechenden Parser wie bspw. HtmlAgilityPack, WebBrowser, ... verwende, stellen diese diese Methoden und Objekte bereit. Aber das ist für den TE hier gar nicht nötig, wenn er einen bestimmte Url mit den notwendigen Parametern per HttpWebRequest aufrufen will. Da ist es IMHO sinnvoller, FireBug, Fiddler, ... kurz anzuschmeißen, zu schauen, was gesendet wird, das in 2 Minuten nachzubauen und an den passenden Stellen die gewünschten Werte einzuschleusen (bspw. für Suchbegriffe)

    Spät. bei JavaScript versagen auch die Parser (mit Ausnahme der Browserkomponenten), da sie das zwar darstellen aber eben nicht ausführen können. Wenn man den Request so sendet, wie der Browser es effektiv tun würde, stört das aber nicht.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Samstag, 12. März 2011 21:42
    Moderator
  • Hallo Stefan,

    dann hast Du den Wunsch von D. in diesem Punkt höchstwahrscheinlich anders verstanden als ich.
    Ich beantworte hier den reinen Wunsch:
    • ... ich möchte jetzt den Klick des Buttons "Druck" simulieren.

    ich denke, da ist meine Info IMHO die empfehlenswerte - sorry :-).
    Wenn aber eine "bestimmte URL", die mittels POST-Parametern (wie ja auch in meinem ersten Beispiel implementiert) erstellt (gerendert) werden "kann" gemeint ist, so bin voll bei Dir - nämlich dies dann auch mit dieser Methode zu tun. Dies ist ja aber eigentlich schon von mir und Dir erklärt worden. 

    Eine andere Sache ist die, dass es ggf. Vorteile in der Herangehensweise über Parsing geben kann, die bei Änderungen der Seite so stabiler sein können (wenn man es über DOM-Parsing macht). Hier kann zum Beispiel gemäß der Struktur entschieden werden.
    Dies nur erwähnt - weil nicht immer die schnellste Lösung auch die beste ist ;-)

    Beide (Fiddler-Hacking / DOM-Struktur-Parsing) Herangehensweisen sind nicht 100% sicher. Der Client kann sich eigene Zustände halten und je nach dem reagieren - ein voher ausgelener Request kann zu einem anderen Zeitpunkt falsch sein.

    Aber seis drum, ich denke, die Essenzen sind jetzt dargelegt und wir warten mal D.'s Antwort ab.


    ciao Frank
    Samstag, 12. März 2011 22:13
  • Hallo Frank,
    Ich beantworte hier den reinen Wunsch:
    • ... ich möchte jetzt den Klick des Buttons "Druck" simulieren.

    ich denke, da ist meine Info IMHO die empfehlenswerte - sorry :-).

    ok, in dem Punkt bzw. bei der Frage und der dazugehörigen Antwort geb ich mich geschlagen :)

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Samstag, 12. März 2011 22:19
    Moderator
  • Hallo Stefan,

    Du hast ja in der anderen Sichtweise auch vollkommen Recht - es ist auch eine gute Möglichkeit den Browser-Request zu nutzen. D. kennt halt jetzt beide Möglichkeiten.

    eine gute Nacht noch.


    ciao Frank

    Samstag, 12. März 2011 22:45
  • Hallo! Bekomme ies mit Fiddler einfach nicht nachgebaut. Ich habe schon vieles versucht, aber es geht immer noch nicht. Mano, ein Albtruam.

    Grüße!

    Sonntag, 13. März 2011 15:11
  • Hi,

    Bekomme ies mit Fiddler einfach nicht nachgebaut. Ich habe schon vieles versucht, aber es geht immer noch nicht. Mano, ein Albtruam.

    dann bleibt dir wohl nichts anderes übrig, als hier mal die gewünschte Ziel-Url zu posten. Dann kann man versuchen, dir bei der Umsetzung zu helfen.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Sonntag, 13. März 2011 16:19
    Moderator
  • Hallo D.,

    Dann ggf. mit den Click-Auslösung aus meinem Beispiel versuchen, oder mir zum Beispiel (wenn es öffentlich nicht geht) Deine URL reproduzierbar zumailen: FrankAddDzaebel.Net

     


    ciao Frank
    Sonntag, 13. März 2011 17:48
  • Hallo! Danke für das Angebot. Emial habe ich bereits versandt. Grüße!
    Dienstag, 15. März 2011 17:13
  • Hallo D.,

    die von mir erwähnte Click-Methode scheint schon mal das gewünschte Ergebnis zu ergeben:

      string webAdresse = "http://www.DeineWebAdresse......"
      string druckButtonName = "cmdImageButton(70070)";
    
      private void Form1_Load(object sender, EventArgs e)
      {
       webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;
       webBrowser1.Navigate(webAdresse);
      }
      bool clickAusgeführt = false;
    
      void WebBrowser1_DocumentCompleted(object sender, 
         WebBrowserDocumentCompletedEventArgs e)
      {
       if (clickAusgeführt) return;
       var htmlDruckButton = webBrowser1.Document.
         GetElementById(druckButtonName);
       htmlDruckButton.InvokeMember("Click");
       clickAusgeführt = true;
      }


    ciao Frank

    • Als Antwort markiert DulcineaS Freitag, 18. März 2011 23:11
    Dienstag, 15. März 2011 18:25
  • Hallo Frank, vielen, vielen Dank! Funktioniert super!

    Habe noch ene Frage: auf der gleichen Site möchte ich die Checkbox "txtPodFlag" markiren, bevor ich den Button klicke.

    Habe nach "input" gesucht, ein Colection zurückbekommen, in dieser Collection nach dem Namen "txtPodFlag" gesucht, aber dieser ist nicht drin...

    Danke für die Hiilfe!

    <td align="right" class="head" style="vertical-align:middle;">
         <div class="checkboxhead" style="height:15px;">
          <table style="height:15px;vertical-align:middle;" cellpadding="0" cellspacing="0">
           <tr>
            <td style="height:100%; text-align:right;">
         Exportieren
        </td>
        <td style="height:100%;">
         <input type="checkbox" name="txtExport" value="Y" onclick="changeSelect(this);" class="checkbox">  
        </td>
        <td style="height:100%; text-align:right; width:180px;">
               Beleg
           </td>
           <td style="height:100%;">
            <input type="checkbox" name="txtPodFlag" value="Y" onclick="changeSelect(this);" class="checkbox">
           </td>
          </tr>
         </table>
      </div>
        </td>

    Donnerstag, 17. März 2011 12:08
  • Hallo!

    Ich habe folgende Seite und möchte mit Hilfe des WebBrowser-Controls eine automatische Anmeldung vornehmen (d.h. User und Pasword ausfüllen und dann den Logn-Klick ausführen).

    <table class="login">
      <tr class="title topborder">
      <td colspan="2">
          Your GLS Login
      </td>
       </tr>
       <tr>
         <td width="70">
         Benutzername
         </td>
         <td>
         <input type="text" name="txtOpenAreaLoginUserName" maxlength="180" size="15" value="">
         </td>
       </tr>
       <tr>
         <td>
         Passwort
         </td>
         <td>
         <input type="password" name="txtOpenAreaLoginPassword" maxlength="20" size="15" value="">
         </td>
       </tr>
       <tr>
         <td>
         </td>
         <td>
      <input type="image" src="fixedimages/button_arrow.gif">
           <a href="javascript:SendLoginForm();resetTimer();">
            Login 
            </a>
         </td>
       </tr>
       <tr>
       ...
    

     

    Dazu benutze ich folgenden Code:

    string userNameControl = "txtOpenAreaLoginUserName";
    
    var htmlUserNameControl = (sender as WebBrowser).Document.GetElementById(userNameControl);
    
    if (htmlUserNameControl != null)
    
    htmlUserNameControl.InnerText = "MyUserName";
    
    var htmlPasswordControl = (sender as WebBrowser).Document.GetElementById(userNameControl);
    
    if (htmlPasswordControl != null)
    
    htmlPasswordControl.InnerText = "MyPassword";
    
    
    

    Aber wie kann ich jetzt

    SendLoginForm();resetTimer();

    ausführen?

    Danke für die Hilfe!

     

     

    Sonntag, 17. April 2011 20:00
  • Hallo!

    InvokeScript löst das Problem.

    Vielen Dank für die Hilfe!

    • Als Antwort markiert DulcineaS Sonntag, 17. April 2011 21:06
    Sonntag, 17. April 2011 21:05