Laden...
G
GarlandGreene myCSharp.de - Member
Softwareentwickler .NET / ABAP Emmerich, NRW Dabei seit 18.08.2006 497 Beiträge
Benutzerbeschreibung

Forenbeiträge von GarlandGreene Ingesamt 497 Beiträge

21.12.2006 - 17:13 Uhr

du kannst mit RegisterClientScriptBlock(string key, string script) ein JavaScript definieren, das beim Laden der Seite ausgeführt wird.

PS: MSDN Library-Beitrag zu JavaScript

21.12.2006 - 10:25 Uhr

das liegt wahrscheinlich daran, daß du über Application.Run eine Standard-Nachrichtenschleife aufmachst und die Ausführung der aufrufenden Methode danach sofort fortsetzt, ohne auf die Beendigung der Schleife zu warten. Du machst die Nachrichtenschleife damit zweimal auf, was meines Wissens nach eigentlich einen Fehler erzeugen müsste. Zumindest wird deshalb wohl das Loginform geschlossen und das Mainform gar nicht erst geöffnet.

Du könntest den Logindialog modal (Ausführung wartet) über ShowDialog() öffnen, nach erfolgreichem Login mit dem Hauptfenster fortfahren und bei Abbruch des Logins die Anwendung beenden, ohne das Hauptfenster überhaupt aufgemacht zu haben.

15.12.2006 - 09:11 Uhr

wenn ich jedes mal, wenn ein Kunde mir in der Vergangenheit einen Fehler gemeldet hat, vom Stuhl gekippt wäre, hätte ich eine lange und aufregende Krankenhausgeschichte vorzuweisen 😁

01.12.2006 - 07:38 Uhr

hast du nach der Installation des SQL Express den Netzwerkzugriff in den Servereinstellungen aktiviert?

23.11.2006 - 07:56 Uhr

Glaub ich eher weniger. Wie sieht denn dein ConnectionString aus?

23.11.2006 - 07:11 Uhr

Der Server muss fürs Netzwerk freigeschaltet werden (also der SQL-Server selbst, nicht der Rechner, auf dem der Server läuft. Standardmäßig nimmt der SQL-Express keine Verbindungen per TCP entgegen).

Schau mal hier: http://www.vb-magazin.de/KnowledgeBase/Article.aspx?id=10048

15.11.2006 - 10:07 Uhr

Events werden doch in dem Thread ausgeführt, der sie auslöst, oder? Man müsste beim "Empfänger" erst feststellen, ob man im korrekten Thread ist (this.InvokeRequired) und wenn das nicht der Fall ist, über Invoke oder BeginInvoke und einen passenden Delegaten die Funktion sich selbst nochmal aufrufen lassen.

13.11.2006 - 15:41 Uhr

Im VStudio oder im Browser? Die Designer-Voransicht kapituliert bei meinen Webseiten auch immer, da ich ohne Tabellen und nur mit Divs bzw. Panels und CSS-Styles arbeite. Im Browser sieht es dann aus wie gewollt. Das Design ist aber tatsächlich ein leichter Krampf.

PS: Das .Net-Framework 1.1 hat in der Standardeinstellung für den ASPNET-Workerprozess anscheinend leichte Probleme mit Fremdbrowsern. Da werden Firefox und Co. teilweise als nicht CSS-kompatibel behandelt, was das Design natürlich komplett zerstört. Das kann man in der machine.config ändern, allerdings habe ich mich selbst noch nicht daran gemacht, das auch umzusetzen. Ich entwickle nur fürs Intranet und da nutzen wir aus Gründen der Einfachheit (integrierte Authentifizierung) den IE.

13.11.2006 - 12:02 Uhr

das passende Steuerelement wäre ein Panel, das erstellt Clientseitig dann ein DIV.

13.11.2006 - 10:56 Uhr

die meisten Serversteuerelemente lassen sich über die Visible-Eigenschaft ein- und ausblenden. Für den Zugriff auf das Element muss es sich innerhalb der FORM-Tags der ASPX-Seite befinden und das Attribut

runat="server"

haben.

12.11.2006 - 12:06 Uhr

du benötigst einen CurrencyManager, der die aktuell im Grid gewählte Zeile verwaltet. Über die "Current"-Eigenschaft des CurrencyManagers kommst du dann an die aktuelle Zeile.

08.11.2006 - 22:10 Uhr

€: ich sollte auch die letzten Sätze lesen...

08.11.2006 - 17:01 Uhr

hm...ich dachte zwar, das hätte ich probiert - da das jetzt aber genau so funktioniert, war das wohl meine von zu viel Koffein angeregte Phantasie. Danke, das war die Lösung.

08.11.2006 - 16:11 Uhr

Hallo,

ich habe in einem Projekt eine ArrayList mit diversen Objekten desselben Typs. Diese ArrayList wird als Datenquelle für ein DataGrid genutzt.

Der Anwender soll in der Lage sein, einzelne Objekte aus dieser Liste zu entfernen. Die dazugehörige Methode (momentan noch in einem Button-Event) sieht wie folgt aus:


		private void btnRemovePalletFromPosition_Click(object sender, System.EventArgs e)
		{

			if (currMgrAssignedPallets != null && currMgrDeliveryPositions != null)
			{
				DeliveryItem item = currMgrDeliveryPositions.Current as DeliveryItem;
				PalletNumber pnr = currMgrAssignedPallets.Current as PalletNumber;
				if (pnr != null && item != null)
				{
					currMgrAssignedPallets.EndCurrentEdit();
					int pos = currMgrAssignedPallets.Position;
					if (pos > 0)
						currMgrAssignedPallets.Position--;
					currMgrAssignedPallets.Refresh();
					item.PalletList.Remove(pnr);
					main.CurrentDelivery.UnassignedPallets.Add(pnr);
				}
			}

			// interne zweite ArrayList mit einer gefilterten Darstellung der
			// gelöschten und damit freien Paletten erzeugen
			this.buildFreePalletsList();

			try
			{
				this.Refresh();
			}
			catch (Exception ex)
			{
				Console.WriteLine(ex.Message);
			}
		}

Entfernt der Anwender jetzt über den Button ein Objekt aus der Liste, wird folgender Fehler erzeugt: "kein Wert bei Index 3" (wobei 3 für den höchsten Index der Liste vor der Löschung steht). Der CurrencyManager currMgrAssignedPallets ist für die Liste, in der ich lösche, zuständig. Ich habe es mit der RemoveAt-Funktion des Managers und auch über die Remove-Funktion der ArrayList selbst probiert - sobald ich ein Objekt aus der Liste entferne, knallt es.

den Try...Catch-Block habe ich schon eingefügt, um an das Exception-Objekt (IndexOutOfRangeException) zu kommen, da der Fehler beim Refresh hochkommt. Laut StackTrace sieht das ganze so aus, als käme der Fehler beim Zeichnen des anzeigenden Grids zustande. Wäre nett, wenn mir jemand einen Hinweis geben könnte, was ich da falsch mache...

07.11.2006 - 08:38 Uhr

DialogResult result = MessageBox.Show("Wollen Sie diese Aktion durchführen?", "Abfrage", MessageBoxButtons.YesNo)

if (result == DialogResult.Yes)
{
// aktion durchführen
}

€: ich werd alt und langsam...

06.11.2006 - 17:53 Uhr

im Prinzip muss man da rückwärts zählen, also:


for (int nI = Application.OpenForms.Count - 1; nI >= 0; nI--)
{
Form frm = Application.OpenForms[nI] as Form;
if (frm != null)
frm.Close();
}

30.10.2006 - 20:09 Uhr

was, wo, wie? 😉

Ich finds ne kleine Frechheit, was MS sich da erlaubt.

30.10.2006 - 19:44 Uhr

Centrino ist keine CPU, sondern nur so eine Art Marketingbegriff für eine Kombination mehrerer Intel-Produkte. Der Prozessor bei Centrino-Notebooks ist ein Pentium M.

30.10.2006 - 19:42 Uhr

angeblich werden nur so ganz unwichtige Details wie das Debugging unter Vista nicht laufen.

27.10.2006 - 11:33 Uhr

nein, das Verhalten ist wirklich so gewollt und wird auch vom Browser selbst so umgesetzt (ist also clientseitig, daher von dir auf Serverseite nicht beeinflussbar). Mehrere Leerzeichen kannst du über das von Peter Bucher beschriebene Verfahren (mehrere " ") erreichen.

Für was genau brauchst du das denn? HTML bietet zusammen mit CSS reichlich Formatierungs- und Ausrichtungsmöglichkeiten. Eventuell versuchst du ja gerade, das Rad neu zu erfinden...

27.10.2006 - 11:02 Uhr

Dieses Verhalten ist HTML-Standard.

27.10.2006 - 10:57 Uhr

Office macht im Endeffekt nichts anderes. Beim Öffnen des Dokuments wird geprüft, ob das Dokument bereits von jemandem bearbeitet wird. Falls das der Fall ist, kann der Anwender das Dokument zwar öffnen und bearbeiten, aber nicht mehr unter diesem Namen speichern. Da dieses Verhalten bei Daten aus Datenbanksystemen normalerweise keinen Sinn macht, ist das Umschalten auf Readonly aller Controls durchaus Sinnvoll.

Wenn man sich den Standardanwendungen annähern will, kann man den Änderungsmodus auch automatisch aktivieren lassen, sobald das möglich ist. Dann hat man im Normalfall das Verhalten, das der Anwender von anderen Anwendungen kennt und im Falle nicht sperrbarer/änderbarer Daten erkennt der Anwender sofort, daß er da nichts ändern kann. Wenn man diesen Automatismus noch optional anbietet, kann jeder das Verhalten einstellen, das er gerne hätte.

27.10.2006 - 09:53 Uhr

Original von DaSchroeter

Original von GarlandGreene
dieses Verhalten ist in Standardanwendungen nur aus einem Grund nicht üblich: es ist dort unnötig. In ERP-Systemen ist sowas Standard und hat auch einen guten Grund. Der Anwender soll nicht erst mühevoll den Auftrag bearbeiten, nur um dann festzustellen, daß ein anderer Anwender den Auftrag gerade sperrt und er nicht speichern kann.
Das kann aber auch automatisch gehen. Das sind so Sachen, die den User eigentlich nicht interessieren. Nur wenn es nicht geht, sollte eine aussagekräftige fehlermeldung kommen 🙂

@Haggy: Kann Dir leider nicht helfen, wäre aber aus denselben Gründen sehr dran interessiert! 🙂

greetz
DaSchroeter

dann hat der Anwender aber bereits Daten geändert, sich mit dem Auftrag beschäftigt und Zeit vertrödelt. Da ist es tatsächlich besser, das System prüft vor Beginn der Bearbeitung, ob der Auftrag gesperrt werden kann, sperrt diesen dann und gibt erst danach die Bearbeitung frei. Eine Prüfung erst beim Speichern sorgt nur dafür, daß sich Mitarbeiter unnötig oft in die Quere kommen. Gleiches gilt auch für Berechtigungsprüfungen und ähnliches. Wenn ein Anwender keine Aufträge ändern darf, sollte die Anwendung ihm das auf simple Art und Weise darstellen. Die Bearbeitungssperre von Controls ist da ganz praktisch, da sie einfach zu erkennen ist und keine Interaktion mit dem Anwender erfordert. Im SAP gibt es zu diesem Zweck jeweils mehrere Transaktionen für einen Arbeitsbereich (z. B. VA01 zum Anlegen, VA02 zum Bearbeiten, VA03 zum Anzeigen eines Auftrags - das ist simpel und unmissverständlich).

27.10.2006 - 09:31 Uhr

dieses Verhalten ist in Standardanwendungen nur aus einem Grund nicht üblich: es ist dort unnötig. In ERP-Systemen ist sowas Standard und hat auch einen guten Grund. Der Anwender soll nicht erst mühevoll den Auftrag bearbeiten, nur um dann festzustellen, daß ein anderer Anwender den Auftrag gerade sperrt und er nicht speichern kann.

26.10.2006 - 13:19 Uhr

C# bzw. .Net hat viele Vorteile gegenüber VB6 - Geschwindigkeit ist da noch der uninteressanteste.

23.10.2006 - 15:58 Uhr

je nach Art der Collection (bzw. der Implementation der Schnittstellen) bekommt das Gridview seine Informationen über Reflection. Eine DataTable ist auch nur eine Collection, genauso wie eine DataRow (die enthält eine Collection von DataColumns).

21.10.2006 - 19:11 Uhr

ich übermittle in solchen Fällen in der URL immer eine Guid, die ich zusammen mit einem Zusatzstring als Schlüssel für Session-Daten verwende. Da kann keiner rummanipulieren und ich kann damit ganz gut steuern, was meine Anwendung in diversen Szenarien machen soll.

18.10.2006 - 13:37 Uhr

im Codebehind muss der Handler genauso wie bei allen anderen Anwendungen auch registriert sein. Über den Designer erledigt VStudio das selbst, wenn man so eine Methode aber einfach selber schreibt, muss man sie auch selbst an das Event binden.

17.10.2006 - 22:05 Uhr

Datenbindung mit ILists funktioniert auf jeden Fall (ich benutze NHibernate 1.02 im 1.1er-Framework), eventuell funktioniert einfach die Anzeige im Designer nicht. Da ich mit VStudio 2003 und .Net 1.1 keine Generics habe, kann ich das hier nicht nachvollziehen. Händisch eingetragen funktionieren die Bindings...

17.10.2006 - 09:27 Uhr

die Cookies werden doch bei jedem Request mitgeschickt. Request.Cookies[] sollte u.a. auch deine zwei Cookies enthalten.

16.10.2006 - 09:46 Uhr

du kannst die SelectedValue im Ereignis ItemDataBound des Grids für jede Zeile setzen. Ist etwas aufwändig, funktioniert aber einwandfrei.

Beispiel:


		private void grdPets_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
		{
			if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
			{
				Pets pet = e.Item.DataItem as Pets;
				if (pet != null)
				{
					DropDownList ddl = e.Item.Cells[2].FindControl("ddlPetKind_View") as DropDownList;
					if (ddl != null)
					{
						ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(pet.Typeid.ToString()));
					}

					ddl = e.Item.Cells[4].FindControl("ddlPetRace_View") as DropDownList;
					if (ddl != null)
					{
						ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(pet.Raceid.ToString()));
					}

					Label lbl = e.Item.Cells[5].FindControl("lblGebDat") as Label;
					if (lbl != null)
					{
						lbl.Text = pet.Birthdate.ToShortDateString();
					}
				}
			}
			else
			{
				if (e.Item.ItemType == ListItemType.EditItem)
				{
					Pets pet = e.Item.DataItem as Pets;
					if (pet != null)
					{
						DropDownList ddl = e.Item.Cells[2].FindControl("ddlPetKind_Edit") as DropDownList;
						if (ddl != null)
						{
							ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(pet.Typeid.ToString()));
						}

						ddl = e.Item.Cells[4].FindControl("ddlPetRace_Edit") as DropDownList;
						if (ddl != null)
						{
							ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(pet.Raceid.ToString()));
						}

						TextBox txtbox = e.Item.Cells[5].FindControl("txtGridGebDat") as TextBox;
						if (txtbox != null)
						{
							txtbox.Text = pet.Birthdate.ToShortDateString();
						}
					}
				}
			}
		}


10.10.2006 - 10:50 Uhr

Du musst wahrscheinlich erst BindingManagerBase.EndCurrentEdit() aufrufen.

10.10.2006 - 10:41 Uhr

dieser "Formelinterpreter" hört sich nach Access an. Das kann .Net meines Wissens nach nicht out of the box, sowas kann man aber natürlich programmieren.

Welches Reporting man zum VStudio dazubekommt, hängt von der Version ab: http://www.microsoft.com/germany/msdn/vstudio/products/produktvergleich.mspx
Bei der Professional ist CR dabei.

09.10.2006 - 07:50 Uhr

du könntest dem Benutzer, unter dem der ASPNET-Workerprozess läuft (im Standard ASPNET), auf dem anderen Rechner die entsprechenden Zugriffsrechte erteilen.

06.10.2006 - 11:10 Uhr

einfach von oben bis unten durch die Liste laufen und schauen, ob der gerade geprüfte Datumsbereich ein Anfangs- oder Enddatum hat, das kleiner ist, als das von den vorherigen Durchläufen "gemerkte" (der erste Eintrag der Liste kann dabei als Anfangswert für den überlappenden Bereich dienen).

Für den Fall, daß ein Datum komplett aus dem Rahmen fällt und überhaupt nicht mit den anderen zusammenfällt, sollte dabei jeweils auch geprüft werden, ob das Anfangsdatum nach dem bisher ermittelten Enddatum bzw. das Enddatum vor dem bisher ermittelten Anfangsdatum liegt - da gäbe es dann keinen passenden Bereich.

04.10.2006 - 10:18 Uhr

über die Systemtabellen sysobjects und syscolumns der jeweiligen Datenbank kann man die genauen Tabellenstrukturen erfahren. sysobjects.name enthält den Tabellennamen, sysobjects.xtype müsste "U" enthalten ("S" steht für Systemobjekte, "PK" für Primärschlüssel, "FK" für Fremdschlüssel, "U" sollten Userobjekte sein). Syscolumns wird über das Feld ID in einer n:1-Beziehung auf Sysobjects verbunden. Die Feldreihenfolge erhält man dann über syscolumns.colorder. Der Datentyp ist etwas verschlüsselt über syscolumns.xtype bzw. die Systemtabelle systypes herauszubekommen.

30.09.2006 - 20:45 Uhr

ich würds folgendermaßen machen:

Nacheinander die angegebenen Seiten runterladen, nach Links suchen und die in eine Collection schieben (z. B. in eine NameValueCollection, bei der du den Namen der Source-Seite inkl. URL als Key nimmst, so kannst du aus dem Link wieder auf die Sourceseite schliessen). Danach kannst du die Collection einfach von oben nach unten abarbeiten.

Du könntest die Downloads auch kaskadieren, indem du nach einem Download einer Y-Seite diese nach weiteren Links scannst, prüfst ob die gefundenen Links schon in der NameValueCollection sind und die neuen Links an die Collection anhängst. Da müsste man sich aber noch eine Kleinigkeit ausdenken, um das ganze auf eine bestimmte Anzahl von Ebenen begrenzen zu können. Die einfachste Variante, die mir da einfällt, wäre die Nummer der Ebene an den Anfang des Collection-Keys zu setzen und die URL dann mit einem Unterstrich davon abgrenzen. So kann man dann aus dem Key auch noch auf die Hirarchieebene schliessen.

29.09.2006 - 09:27 Uhr

du hast das mit der integrierten Authentifizierung falsch verstanden: der ASPNET-User wird als Anmeldebenutzer an den SQL-Server weitergereicht, weil der ASPNET-Benutzer die ASP-Seite ausführt. Alles, was du da programmierst, wird erstmal mit den Rechten dieses Benutzers ausgeführt.

Was du in diesem Administrationstool siehst, weiß ich nicht. Unter Umständen ist das der Benutzername, den der IIS als Client empfängt (der IIS kann die Berechtigung zum Anzeigen der Seiten auch über die Windows-Authentifizierung ziehen, wenn der Internet Explorer verwendet wird). Auf jeden Fall läuft der Workerprozess nicht unter deinem Benutzernamen, sondern als ASPNET.

Entweder gibst du dem ASPNET die Berechtigungen für den SQL-Server oder du richtest im SQL-Server einen Benutzer ein und änderst im Connection String die Authentifizierungsmethode entsprechend.

28.09.2006 - 23:24 Uhr

Das Visual Studio hat mit dem Benutzernamen nichts zu tun. Der ASP.NET Workerprozess (aspnet_wp) läuft per Default mit diesem Benutzernamen (kann man im Task Manager beobachten, nachdem man eine ASP.Net-Anwendung aufgerufen hat und der Workerprozess gestartet ist).

Man kann den Benutzernamen für den Worker auch ändern. Für das .Net Framework 1.1 liegt im Verzeichnis C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG\ die Datei "machine.config". Hier ist im Abschnitt <processModel> der Benutzername konfiguriert. "machine" sorgt für eine Anmeldung als ASPNET, "SYSTEM" lässt den Worker als privilegierten Systemuser laufen. Zusätzlich kann man auch einen eigenen Benutzer angeben (muss dann natürlich vorher händisch angelegt werden). So kann man den Workerthread im Bedarfsfall auch mit Berechtigungen innerhalb einer Domäne laufen lassen, falls man das braucht.

Als Authentifizierung wird das VStudio wahrscheinlich die integrierte Windows-Authentifizierung benutzt haben - die arbeitet mit Benutzername und Kennwort des Benutzers, unter dessen Konto der Prozess läuft. Du kannst im SQL Server aber auch einfach irgendeinen Benutzernamen und ein Passwort angeben und die Verbindung dann nicht über "Integrated Security=SSPI" sondern über "User ID=XYZ;Password=ABC" im Connection String authentifizieren. Damit bist du dann unabhängig vom Benutzerkontext, unter dem der ASP.Net-Worker läuft.

26.09.2006 - 17:02 Uhr

http://whatis.techtarget.com/definition/0,,sid9_gci212139,00.html

Mit anderen Worten: "foo" bedeutet so viel wie "irgendwas".

22.09.2006 - 10:23 Uhr

Was für ein Variablentyp denn?

string x = "1234";
int len = x.Length;

int i = 88379448;
int len = i.ToString().Length;

19.09.2006 - 14:55 Uhr

Original von DOOZER

nein, natürlich nicht. Wenn sowas vorkommt, hat man ein Problem. Hab bisher aber nicht davon gehört, daß das bei sauberer Programmierung vorkommt.
Hm, nen Klick ohne Logik?!?
Ich hab da ja noch nix programmiert LOL

du hast ja auch noch kein Problem. Bei jedem Aufruf erzeugt der aspnet_wp ein paar Objekte, schmeisst die wieder weg, erzeugt neue Objekte, schmeisst auch die wieder weg. Man könnte den dabei benötigten Speicher jetzt wieder freigeben, das macht der aber erst, wenn es nötig ist.

Ich glaub, du gehst davon aus, die Kiste schmeisst einfach wild Daten weg.
Genau das tut er beim recyclen, Session InProc! Retten ist da nix! Außer Du wüsstest, wo die Daten, wie abgelegt sind! MEINE REDE!

er schmeisst nicht wild Daten weg, sondern er gibt Speicher frei, der nicht mehr benötigt wird. Wenn du ein Objekt mit Dispose() freigegeben hast, ist das Ding halt weg - das darf der GC dann auch getrost wegschmeissen und den Speicher freigeben. Was willst du da noch retten?

Das ist der Nachteil bei Closed Source - du hast niemals volle Kontrolle.
Absolut Richtig!

Die Tatsache, daß das Framework aber recht erfolgreich für große Anwendungen eingesetzt wird ...
Hm? Wo?!?
Andere Techniken sind da wohl bei weitem mehr vertreten, oder? 😁

Mfg FrankW

klar, ASP.Net ist längst nicht so häufig vertreten wie beispielsweise PHP. Aber der GC ist nicht ASP.Net-spezifisch, das Ding läuft im ganzen .Net-Framework. Als "Referenz" kannst du dafür mehr oder weniger alle .Net-Anwendungen heranziehen.

Hast du denn aktiv wirklich ein Problem mit knapp werdendem Speicher (und nicht einfach nur einem aspnet_wp, der nach einem Postback mehr Speicher braucht) auf einem Server oder mit verlorenen Sessiondaten?

19.09.2006 - 14:07 Uhr

Original von DOOZER
Sry, wenn ich mich nochmal melde, aber ich glaube ihr seht das mit anderen Augen als ich!
Ich habe genug über die Speicherverwaltung von .Net gelesen, Heapgrößen, Generationenverwaltung, ...
Trotzdem kann und will ich nicht blind der Blackbox vertrauen!

Als Beispiel, programmiert ihr eine Applikation, die 2 Monate am Stück irgendwelche Aktionen durchführt. Der Speicher wächst und wächst und irgendwann ist Schluss mit Speicher! Boom, der Watchdog schlägt zu und startet das FEHLERHAFTE Programm neu!
Eventuell wichtige Daten des Restert-Zeitpunktes sind verloren!
Workaround!
Ist das ein Zustand, den Ihr haben wollt?!?

nein, natürlich nicht. Wenn sowas vorkommt, hat man ein Problem. Hab bisher aber nicht davon gehört, daß das bei sauberer Programmierung vorkommt.

Recyclen vom aspnet_wp, ok, egal wenn da Benutzer rausfliegen, können sich ja neu einloggen! Kann man tun!

Ich glaub, du gehst davon aus, die Kiste schmeisst einfach wild Daten weg. Hier kannst du in einer ganz brauchbaren Zusammenfassung nachlesen, wie der GC arbeitet.

Also her mit dem CLR-Profiler, SOS.dll und 100 anderen kleinen Tools, die irgendwelche Gigabyte-Dumps ausspucken! Lesen Lesen Lesen!
Ergebnisse vergleichen und sich wundern, daß die Ergebnisse sich bei gleichen Bedingungen immer und immer wieder ändern!

Da kann man doch verrückt werden, oder?!?

Ihr habt die Meinung, daß macht der Garbage-Collector schon!
Ich nicht! Ich möchte das nachvollziehen!

Worauf ich leider bisher nicht mal den Ansatz einer Möglichkeit gefunden habe!

Genau das gleiche zur Sessionverwaltung!
Sicher kann ich sagen, es ist das Problem des Webservers, die Sessions sicher zu halten! Aber das sollte meiner Meinung nach mein Problem sein!
Dafür besitze ich dann aber auch 100% Kontrolle darüber!

Danke für eure Hilfe!
Mfg FrankW

Das ist der Nachteil bei Closed Source - du hast niemals volle Kontrolle. Die Tatsache, daß das Framework aber recht erfolgreich für große Anwendungen eingesetzt wird und da nicht ständig Benutzer rausfliegen oder Maschinen wegen Speichermangel hochfliegen, sollte allerdings dafür sprechen, daß Microsoft mit dem Framework tatsächlich gute Arbeit geleistet hat und die von dir angesprochenen (theoretischen) Probleme praktisch durch saubere Programmierung vermeidbar sind.

19.09.2006 - 13:13 Uhr

anscheinend kann man in der web.config innerhalb der <configuration>-Deklaration weitere Verzeichnisse angeben:


<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="dir1;dir2\bin"/>
      </assemblyBinding>
   </runtime>
</configuration>

19.09.2006 - 12:28 Uhr

wofür Argumente, wenn sie eh durch Getrolle weg"argumentiert" werden?

Aber gut...

  1. Speicherbedarf des aspnet_wp: Der Speicherbedarf des aspnet_wp richtet sich sich anscheinend nicht nach dem Speicher, der im Rechner eingebaut ist, sondern nach dem, was gerade verfügbar ist. Sprich: wenn ein anderer Prozess mehr Speicher benötigt und der gesamte freie Speicher knapp wird, kann der aspnet_wp auch Speicher wieder freigeben. Er macht es wahrscheinlich nur dann, wenn entweder eine gewisse Schwelle an freizugebendem Speicher überschritten wird oder wenn eben der freie Speicher im System knapp wird. Ist noch reichlich Speicher frei, sieht der Prozess wahrscheinlich einfach keinen Grund darin, den Speicher freizugeben.

Du musst hier also erstmal kein Problem lösen, weil keines existiert. Wenn der Speicher wirklich knapp wird und der aspnet_wp anderen Prozessen den Speicher wegnimmt, dann hast du ein Problem. Kannst du ja mal nachvollziehen, indem du eine kleine .Net-Anwendung bastelst, die wie wild Hauptspeicher zieht (beispielsweise ein paar hunderttausend Objekte erstellen, die jeweils mehrere KB große Felder initialisieren). Der aspnet sollte dann irgendwann anfangen, nicht mehr benötigten Speicher freizugeben.

  1. Speicherlecks: das ist einfach eine Erfahrung, die in den letzten Jahren gemacht wurde. Es sieht zwar so aus, als würden Anwendungen, die mit dem .Net-Framework erstellt worden sind, ungewöhnlich viel Speicher benötigen, allerdings hat das wie unter 1. schon beschrieben auch damit zu tun, daß das Speichermanagement des Frameworks sich gerne im freien Speicher austobt und der GC erst dann anschlägt, wenn es nötig wird. Er wird dann aber definitiv tätig und räumt auf. Allerdings kann unsaubere Programmierung schon dafür sorgen, daß der GC nicht großartig aufräumen kann. Das sollte bei deinem Beispiel aber erstmal nicht der Fall sein.

  2. Die Session-Daten gehören dem Webserver und aus Sicherheitsgründen hat da keine andere Anwendung was drin zu suchen. Wenn du Daten einzelner oder aller Sessions auswerten willst, hast du genug Möglichkeiten, das in der Anwendung selbst zu machen.

19.09.2006 - 10:24 Uhr

nicht schlecht, so viel Müll in so wenig Text...

18.08.2006 - 09:02 Uhr

<div width=100% height=100%> sollte das Element auf die maximale Größe seines Containers bringen (wenn es direkt im Body liegt, also auf den ganzen Bildschirm). Zumindest mit CSS ist das Layout aber stark browserabhängig, der IE6 ist dazu einfach zu blöd.