.net framework cacht alles und knallt den Ram voll ->asp.net stürzt ab

Do_0mi

Mitglied
hi liebe community,

ich habe ein problem...
...und zwar haut mein asp.net webservice bei jedem aufruf (alle 10 sekunden) über soap einige kb bzw. mb in den in den prozess aspnet_wp.exe. Dies ist soweit ich weiß das .Net-Framework. ich würde mal sagen, der cacht alles oder so...
wenn der prozess aspnet_wp.exe dann etwa 550mb in den ram geschaufelt hat, stürtz der asp.net webservice ab (der asp.net webservice ein estos sdk). gleichzeitig stürtz dann auch der cti procall server ab - sprich der telefonserver (wieso auch immer :( )
wie kann man verhindern, dass das .net framework der ram vollhaut bzw. alles cacht?
oder wisst Ihr, wieso der dem Ram vollknallt?

vielen dank für antworten schonmal im vorraus :)

Viele Grüße, Domi

edit: gibt es eine Möglichkeit in ASP.NET einen Prozess (aspnet_wp) zu killen? hab schon gegooglet, aber nichts lief einwandfrei...
 
Zuletzt bearbeitet:
Würde auch schwer behaupten das der Fehler in deinem Webservice liegt. Der GC macht seine Aufgabe im allgemeinen sehr gut. Hast du einen FileStream oder ähnliches in deinem Service? Poste mal den Quellcode, Dann können wir vllt helfen, kannst du einschränken wann er soviel in den Ram läd, also die Methode die das hervorruft?

Gruß

Avorin
 
@ Nico Graichen: Memory Leak wird es wahrscheinlich sein...
aber wie entfernen?
@ Avorin: FileService nicht direkt. Der WebService greift Daten des Telefonservers (cti server) ab...

PHP:
private ENETTSCLib.Application enettsc = null;
private ENETTSCLib.Line myLine = null;
private static long ELINEERR_OPERATIONUNAVAIL = 0x80000049;
public ArrayList Connecting()
        {
            if (enettsc != null)
            {
                enettsc.Dispose();
                enettsc = null;
            }

            try
            {
                enettsc = new ENETTSCLib.ApplicationClass();
            }
            catch (Exception)
            {
                throw;
            }
            enettsc.SetServer(strServer, int.Parse(strPort));
            enettsc.SetLogin(strUsername, strPassword);

            try
            {
                enettsc.Connect();

                myLine = enettsc.FirstLine;

                enettsc.OnCallBusy += new _IApplicationEvents_OnCallBusyEventHandler(enettsc_OnCallBusy);
                enettsc.OnCallConferenced += new ENETTSCLib._IApplicationEvents_OnCallConferencedEventHandler(enettsc_OnCallConferenced);
                enettsc.OnCallConnected += new ENETTSCLib._IApplicationEvents_OnCallConnectedEventHandler(enettsc_OnCallConnected);
                enettsc.OnCallDestroyed += new ENETTSCLib._IApplicationEvents_OnCallDestroyedEventHandler(enettsc_OnCallDestroyed);
                enettsc.OnCallDialing += new ENETTSCLib._IApplicationEvents_OnCallDialingEventHandler(enettsc_OnCallDialing);
                enettsc.OnCallDisconnected += new ENETTSCLib._IApplicationEvents_OnCallDisconnectedEventHandler(enettsc_OnCallDisconnected);
                enettsc.OnCallHold += new ENETTSCLib._IApplicationEvents_OnCallHoldEventHandler(enettsc_OnCallHold);
                enettsc.OnCallOffering += new ENETTSCLib._IApplicationEvents_OnCallOfferingEventHandler(enettsc_OnCallOffering);
                enettsc.OnCallRingback += new ENETTSCLib._IApplicationEvents_OnCallRingbackEventHandler(enettsc_OnCallRingback);
                enettsc.OnRemotePartyChanged += new ENETTSCLib._IApplicationEvents_OnRemotePartyChangedEventHandler(enettsc_OnRemotePartyChanged);

                foreach (ENETTSCLib.Line line in enettsc.Lines)
                {
                    line.Open();
                }

                refreshTreeView();
                // ...

}

Hoffe Ihr könnt mit dem Code etwas anfangen. Als ich die zweite try-catch-Anweisung mal ausgeblendet hab, hatte sich der steigende Ram pro Aufruf nur um ~30kb erhöht...

Mit freundlichen Grüßen, Domi
 
@ Avorin: Danke für den Post. Die Seite hatte ich auch schon gefunden. Bin nur noch nicht auf den Sprung gekommen, wie ich das nun "funktionsfähig" einbinde... :confused:

Womöglich auch die foreach schleife -> wie groß ist denn enettsc.Lines? und muss das jedes mal durchiteriert werden?
In der enettsc-Lines sind etwa 200 "line", die auch immer durchlaufen müssen / sollten.


Könnt Ihr mir einen Tipp geben, an welche Stelle ich die Code-Schnipsel vom o.g. Link einbinde und wie genau?
 
Genau so wie du die Handler anmeldest eben nur mit einem Minus.
also:

Code:
enettsc.OnCallBusy -= new _IApplicationEvents_OnCallBusyEventHandler(enettsc_OnCallBusy);

das new ist wichtig sofern du keine Referenz auf den erstellten Handler speicherst(was du ja eh nicht wollen kannst ^^)

das tust du das sobald das Event nicht mehr gefeuert wird , spätestens aber am Ende der Methode bzw. des Services. oder im Dispose() von "enettsc". Aber das natürlich nur wenn du es auch disposed..(was du vermutlich auch tun solltest)

http://www.mycsharp.de/wbb2/thread.php?threadid=47346

Gruß
 
Zuletzt bearbeitet:
Danke für den Post Avorin

Code:
enettsc.OnCallBusy -= new _IApplicationEvents_OnCallBusyEventHandler(enettsc_OnCallBusy);
hmm... darauf hätte ich ja auch selbst kommen können. stand ja irgendwie schon da...

naja...
Es funktioniert aus irgendeinem Grund trotzdem immernoch nicht :(

stimmt es so überhaupt?

PHP:
try
            {
                enettsc.Connect();

                myLine = enettsc.FirstLine;

                enettsc.OnCallBusy += new _IApplicationEvents_OnCallBusyEventHandler(enettsc_OnCallBusy);
                enettsc.OnCallConferenced += new ENETTSCLib._IApplicationEvents_OnCallConferencedEventHandler(enettsc_OnCallConferenced);
                enettsc.OnCallConnected += new ENETTSCLib._IApplicationEvents_OnCallConnectedEventHandler(enettsc_OnCallConnected);
                enettsc.OnCallDestroyed += new ENETTSCLib._IApplicationEvents_OnCallDestroyedEventHandler(enettsc_OnCallDestroyed);
                enettsc.OnCallDialing += new ENETTSCLib._IApplicationEvents_OnCallDialingEventHandler(enettsc_OnCallDialing);
                enettsc.OnCallDisconnected += new ENETTSCLib._IApplicationEvents_OnCallDisconnectedEventHandler(enettsc_OnCallDisconnected);
                enettsc.OnCallHold += new ENETTSCLib._IApplicationEvents_OnCallHoldEventHandler(enettsc_OnCallHold);
                enettsc.OnCallOffering += new ENETTSCLib._IApplicationEvents_OnCallOfferingEventHandler(enettsc_OnCallOffering);
                enettsc.OnCallRingback += new ENETTSCLib._IApplicationEvents_OnCallRingbackEventHandler(enettsc_OnCallRingback);
                enettsc.OnRemotePartyChanged += new ENETTSCLib._IApplicationEvents_OnRemotePartyChangedEventHandler(enettsc_OnRemotePartyChanged);

                foreach (ENETTSCLib.Line line in enettsc.Lines)
                {
                    line.Open();
                }

                refreshTreeView();

                enettsc.OnCallBusy -= new _IApplicationEvents_OnCallBusyEventHandler(enettsc_OnCallBusy);
                enettsc.OnCallConferenced -= new ENETTSCLib._IApplicationEvents_OnCallConferencedEventHandler(enettsc_OnCallConferenced);
                enettsc.OnCallConnected -= new ENETTSCLib._IApplicationEvents_OnCallConnectedEventHandler(enettsc_OnCallConnected);
                enettsc.OnCallDestroyed -= new ENETTSCLib._IApplicationEvents_OnCallDestroyedEventHandler(enettsc_OnCallDestroyed);
                enettsc.OnCallDialing -= new ENETTSCLib._IApplicationEvents_OnCallDialingEventHandler(enettsc_OnCallDialing);
                enettsc.OnCallDisconnected -= new ENETTSCLib._IApplicationEvents_OnCallDisconnectedEventHandler(enettsc_OnCallDisconnected);
                enettsc.OnCallHold -= new ENETTSCLib._IApplicationEvents_OnCallHoldEventHandler(enettsc_OnCallHold);
                enettsc.OnCallOffering -= new ENETTSCLib._IApplicationEvents_OnCallOfferingEventHandler(enettsc_OnCallOffering);
                enettsc.OnCallRingback -= new ENETTSCLib._IApplicationEvents_OnCallRingbackEventHandler(enettsc_OnCallRingback);
                enettsc.OnRemotePartyChanged -= new ENETTSCLib._IApplicationEvents_OnRemotePartyChangedEventHandler(enettsc_OnRemotePartyChanged);

                enettsc.Dispose();
                enettsc = null;


                return y;
            }
            catch (Exception)
            {
                return null;
            }

... und kommt erst das deregistrieren und dann der Disposer oder umgekehrt? bin mir da nicht so sicher, jedoch haut (egal wie ich es mache) das script immernoch den Ram voll...

Viele Grüße, Domi

edit: Selbst mein Ausbilder ist ratlos, wieso es nicht funktioniert...
Wäre echt supercool, wenn Ihr noch paar Ideen auf Lager habt. ich vertrau euch ;)

edit: - CLOSED -
ESTOS ProCall SDK sucks
 
Zuletzt bearbeitet:
Zurück