Laden...

Meldung von Website: Nicht genügend Arbeitsspeicher bei Zeile 1

Erstellt von Ramokthan vor 7 Jahren Letzter Beitrag vor 6 Jahren 7.028 Views
R
Ramokthan Themenstarter:in
23 Beiträge seit 2012
vor 7 Jahren
Meldung von Website: Nicht genügend Arbeitsspeicher bei Zeile 1

Der Titel lässt vermuten dass die Lösung einfach ist: zu wenig Arbeitsspeicher.
Leider ist das Leben selten so einfach.

Zum Zeitpunkt des Fehlers sind noch 4 von 8 GB Arbeitsspeicher Frei.

Verursacht wird die meldung meiner vermutung nach direkt von der Webseite als Javascript Popup, denn ich kann kein Hinweise im Code auf ein Exceptionhandling dafür entdecken, zumal .Net Exceptions auch anders aufgebaut sind.

verursacht wird das ganze, glaube ich von der verwendeten Webbrowser Klasse die ich benutze um eine Seite zu laden damit ich sie analysieren kann. Es ist btw IMMER dieselbe Seite, die jeweils andere Informationen bereitstellt. Genauer gesagt ist es eine ASPX Seite von Sharepoint.

Mit dem Code will ich nicht allzu ausladend werden, aber das wesentliche ist hier:

            try
            {

                myThread = new Thread(() =>
                {
                    _client = new WebBrowser();
                    _client.ScriptErrorsSuppressed = true;
                    _client.Visible = false;
                    _client.Navigate(CONFIG.SP_Adress, "", null, Auth());
                    _client.SuspendLayout();
                    _client.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(SubmitForm);
                    Application.Run();
                });
                myThread.SetApartmentState(ApartmentState.STA);
                myThread.Start();
            }
            catch (Exception ex) { INTERNALS.MainPage.WriteToOutput(ex.Message + " Node Search.LoadSite"); }
        private void SubmitForm(object i, object j)
        {
            string ElementID = "ctl00_ctl45_g_1996ef12_25ea_49d2_b3ac_1997f48a3d96_SPTextSlicerValueTextControl";
            INTERNALS.MainPage.WriteToProgress("Suche Dokumente");
            HtmlElement formular = _client.Document.GetElementById(ElementID);
            if (formular != null)
            {
                _client.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(SubmitForm);
                _client.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(ListLinks);

                //_client.Document.GetElementById("ctl00_ctl45_g_1996ef12_25ea_49d2_b3ac_1997f48a3d96_SPTextSlicerValueTextControl").SetAttribute("Value", (CONFIG.SU_Workshop.Trim() + " " + CONFIG.SU_InstructorN.Trim()).Trim());
                if (_customsearchstring != null)
                {
                    formular.SetAttribute("Value", _customsearchstring);
                    INTERNALS.MainPage.WriteToOutput("Ermittelter Suchbegriff: '" + formular.GetAttribute("Value") + "'");
                }
                else
                {
                    formular.SetAttribute("Value", _seminar.Nr.Trim());
                    INTERNALS.MainPage.WriteToOutput("Suchbegriff: '" + formular.GetAttribute("Value") + "' Referent(en): " + _seminar.Instructor + (_seminar.Modul > -1 ? " Modul: " + _seminar.Modul : ""));
                }

                HtmlElement form = _client.Document.GetElementById("aspnetForm");
                if (form != null) form.InvokeMember("submit");
            }
            else
            {
                INTERNALS.MainPage.WriteToOutput("Suche Fehlgeschlagen" + Environment.NewLine);
                INTERNALS.MainPage.Threadlock = false;
            }
        }

Im Prinzip soll der versteckte Browser Listen suchen und zu diesen Listen die jeweils aufggelisteten Dokumente finden (und später herunterladen).

in 99% der Fälle funktioniert das auch einwandfrei, nur manchmal kommt es zu dieser Meldung die das ganze Programm anhält.
Ziel wäre es jetzt entweder diese Fehlermeldung zu lösen damit sie nicht mehr kommt, oder zu unterdrücken. Auf dem Systemwo das Programm läuft ist genug Arbeitsspeicher frei, also denke ich dass es ein Serverfehler von der Webseite ist den ich nur irgendwie unterdrücken muss.

Falls jemand mir mit dem Hinweis kommt: Ist doch Sharepoint, benutz doch einfach die Sharepoint API: Das haben wir versucht und es hat leider nicht funktioniert (die gesuchten Listen waren nicht vorhanden) , jedenfalls nicht so schnell wie wir es haben sollten, deshalb wurde mir von meinem Vorgesetzten gesagt ich solle es so lösen. Es sollte eben eine Lösung gefunden werden die möglichst schnell lauffähig ist, wie schmutzig die ist, war offiziell egal.

Hoffe einer von euch weiß etwas, denn per Google findet man absolut keine Einträge zu diesem Fehler.

P
1.090 Beiträge seit 2011
vor 7 Jahren

Wie viel Arbeitsspeicher verbraucht, denn die Anwendung.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

16.806 Beiträge seit 2008
vor 7 Jahren

Die Fehlermeldung wird nicht heissen, zu wenig Arbeitsspeicher sondern OutOfMemoryException.

Und OutOfMemoryException wird auch geworfen, wenn es zu wenig oder ungültige Handles hat.
Und hier scheint es sich um ungültige Handles zu handeln; vermutlich weil zB. das Application.Run() hier sehr dubios is.

Es wäre praktisch, wenn man die ganze Kosntellation kennen würde, um entsprechende Lösungen anzubieten.

R
Ramokthan Themenstarter:in
23 Beiträge seit 2012
vor 7 Jahren

Die Fehlermeldung ist 1zu1 wie im Threadtitel, ich habe sie NICHT übersetzt.
Das ist ein Popup das aufgeht und die Anwendung läuft auch weiter wnen man "OK" klickt.
An keiner Stelle im Programm ist jedoch ein Popup Programmiert, also denke ich dass es von der Webseite kommt und angezeigt wird obwohl ich fehlermeldungen unterdrücke und die ausgbe unsichtbar gemacht habe.

_client.ScriptErrorsSuppressed = true;
                    _client.Visible = false;
                    _client.SuspendLayout();

Die Anwendung braucht in etwa 100-200 MB Arbeitsspeicher zu jedem Gegebenen Zeitpunkt.
Frei sind wie gesagt 4 GB von 8 GB.

Welche Konstellation ist gemeint?
Der 2te Aufruf des WebBrowsers auch?

new WebBrowserDocumentCompletedEventHandler(ListLinks);

Verarbeitet nur noch den Htmloutput des Browserdokuments, sonst nichts mehr.

Grundsätzlich lässt sich das so zusammenfassen:
Der Webbrowaser wird gestartet und eine Suchseite aufgerufen.
Dort wird ein Suchparameter in das Suchfeld eingefügt und nochmal abgeschickt.
Das Ergebnis wird dann ausgewertet (ob es nun im Rahmen des zweckes der Anwendung gültigen Inhalt hat oder nicht wird geprüft).

Application.Run();

Ist notwendig damit der Thread läuft, bzw überhaupt etwas tut.
Nehme ich dies raus macht der Webbrowser gar nichts.

P
1.090 Beiträge seit 2011
vor 7 Jahren

Bekommst du auch den Fehler wenn du die Seite einfach mit einem Browser die Seite aufrufst?

p.s.
Wenn ich dich richtig verstehe willst du nur den Response eines Http Request verarbeiten.
Dazu sollte eigendlich die HttpClient Klasse reichen.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

R
Ramokthan Themenstarter:in
23 Beiträge seit 2012
vor 7 Jahren

Ich habe den Fehler noch nicht bekommen als ich die Seite aufgerufen habe. Wie gesagt ist der Fehler auch nicht permanent. Er kommt allerhöchstens bei 1% der Aufrufe vor, aber er stört/unterbricht den selbstständigen Ablauf des Programms (das später mal als Dienst laufen soll).

Ich habe nicht rausgefunden wie ich mit der HTTPklasse Htmlelemente als Objekte ansprechen kann (getchildren etc.) sowie man sich damit am Webserver authentifiziert, was zwingend notwendig ist. Habe jedenfalls nichts in der API gefunden. Da es damals recht schnell gehen musst habe ich as erstbeste genommen was funktioniert hat.

P
1.090 Beiträge seit 2011
vor 7 Jahren

Ich hatte jetzt mal gegoogled so wie es aussieht kannst du im Webbrowser JavaScript nicht deaktivieren. Meine Vermutung ist, das bei einen Fehler der in JavaScript abgefangen wird und ein Popup aufgemacht wird. (kannst dir ja mal das Html im Browser anschauen).

Zum Client.
how-to-use-httpclient-to-post-with-authentication

C# Webseite auslesen und in Variablen speichern

p.s. Ich hab für mich fest Gestell, da es schneller ist etwas Richtig zu machen als es schnell zu machen. 😉

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

R
Ramokthan Themenstarter:in
23 Beiträge seit 2012
vor 7 Jahren

Wenn ich das ganze Privat programmieren würde, würde ich die Sharepoint API benutzen.
Dann würde das Problem erst gar nicht entstehen.

Leider muss ich das Problem lösen und machen was mir gesagt wird.

das httpclient spuckt leider auch nur rohen text aus, was ich so nur schwer weiterverwenden kann.
Ich habe schon aus gutem Grund den WebBrowser benutzt damit ich mich durch die HTML Objekte mit "getchildren" etc hangeln kann.

der WebClient aus den WPF kann das nicht, dafür kann der Zeug dass der Webbrowser nicht (effizient) kann, weshalb ich die beiden in unterschiedlichen Klassen beide benutze.

Probleme macht aber momentan die Seite die über den WebBrowser aufgerufen wird.
Und aucf die habe ich leider wenig einfluss. ich wüsste auch nicht ob javascript deaktivieren de lösung wäre, denn die links die ich abgreife werden soweit ich das sehe mit javascript reingeladen.

16.806 Beiträge seit 2008
vor 7 Jahren

Welche Konstellation ist gemeint?

Dein Code wird in einer Desktop-Anwendung (Exe) ausgeführt, das dann auf die Webseite zugreift?

C
26 Beiträge seit 2016
vor 7 Jahren

Hi Ramokhtan,

nur mal als spontane Idee:
Vielleicht hilft dir die Chromium-Engine weiter?
Die kannst du über CefSharp in Deine Anwendung einbetten und das alte WebBrowser-Control ersetzen:

http://ourcodeworld.com/articles/read/173/how-to-use-cefsharp-chromium-embedded-framework-csharp-in-a-winforms-application

https://github.com/cefsharp/CefSharp

Ist vielleicht mal einen Versuch wert =)

R
Ramokthan Themenstarter:in
23 Beiträge seit 2012
vor 7 Jahren

Dein Code wird in einer Desktop-Anwendung (Exe) ausgeführt, das dann auf die Webseite zugreift?

So ziemlich genau so.
die Ausgabe des Webbrowsers wird nirgendwo angezeigt, brauche ich auch nicht, ich will mich nur druch die htmltables hangeln und evtl. die Formulare per id ansprechen und abschicken... wie im code es auch gemacht wird.
Was für mich das ganze eigentlich seltsam macht da dieses "Popup" eigentlich doch zum Webbrowser gehört, der hat aber gar kein Element in der UI belegt, also ist nichtmal versteckt. Wie schafft es das Popup trotzdem angezeigt zu werden...

Dazu sei aber noch gesagt dass es eine WPF Anwendung ist bei der ich nur den Webbrowser aus WindowsForms benutze weil der eben das Zeug kann das ich brauche.

@codesoldier
Das werde ich mir mal angucken. Danke.

16.806 Beiträge seit 2008
vor 7 Jahren

Dazu sei aber noch gesagt dass es eine WPF Anwendung ist bei der ich nur den Webbrowser aus WindowsForms benutze

Das kann der Grund sein. Forms mit WPF zu Mischen war noch nie eine gute Idee.

Da das ganze so ziemlich nichts mit dem Forenbereich Webthemen zutun hat -was zumindest am Anfang bei mir den Schein erweckt hat, dass Du von einer Web-App aus das Browser-Control startest - sondern eher eine WPF-Sache ist, hab ich das Thema in die richtige Kategorie verschoben.

W
955 Beiträge seit 2010
vor 7 Jahren

..bei der ich nur den Webbrowser aus WindowsForms benutze weil der eben das Zeug kann das ich brauche. Dann nimm doch die HttpClient-Klasse und einen HTML-Parser wenn du mit der Analyse des HTML-Textes nicht klarkommst.

R
Ramokthan Themenstarter:in
23 Beiträge seit 2012
vor 7 Jahren

Habe ich zu beginn der Programmierung auch angestrebt, aber damit ist keine interaktion mehr mit der Seite möglich. ich habe mir auch das Htmlagility angeschaut und das hat dasselbe problem wie ein einfacher HTMLParser: keine Interaktion mehr möglich aka. Formulare Absenden.

Vll. habe ich auch was übersehen aber in den APIs habe ich nichts dazu gefunden und einen POST manuell zu generieren ist zu aufwendig. (zuviele Parameter/teilweise unbekannte parameter)

Nur diese WebBrowser-Klasse scheint alles zu bieten was ich hier benötige.

R
Ramokthan Themenstarter:in
23 Beiträge seit 2012
vor 6 Jahren

Ich habe die Fehlermeldung nochmal ein paar Stunden recherchiert und herausgefunden dass diese Fehlermeldung angeblich gerne mal von Windows kommt (also wenig bis gar nichts mit dem Webbrowser zu tun hat) wenn der Befehlsregister voll ist und das dies bei 32bit Applikationen recht schnell passiert.

Ich habe sie daher jetzt auf als 64bit Applikation Compiliert und diese Meldungen haben sich seitem drastisch reduziert, ganz weg sind sie dennoch nicht.

241 Beiträge seit 2010
vor 6 Jahren

Das ändert nichts daran, das du Forms und WPF nicht mischen solltest. Den das wird, denke ich, die Quelle deines Problems sein. Und das zu Lösen, falls es überhaupt möglich ist, dürfte weit umständlicher sein als direkt mit den WPF Komponentne zu arbeiten. Wobei ich persönlich die Chromium (CefSharp) Erweiterung nutzen würde, da du so keine IE Engine verwendest, die ja auch nicht gerade so dolle ist.

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog