Das Produkt haben viele Kunden auf eigenen Servern. Das Kind ist schon in den Brunnen gefallen. :-(
Kann denen nicht sagen, sie sollen Windows- oder Frameworkupdates zurücknehmen. Das Problem ist gestern aufgefallen. Wie lange es schon da ist, also was genau der Auslöser ist, kann ich nicht nachvollziehen. Ich vermute, dass es Framework 4.7.2 ist, muss aber nicht sein. Ich weiß nur, dass jetzt das compress andere Ergebnisse liefert, als vor einiger Zeit. Könnte den Zeitpunkt zwar theoretisch eingrenzen, aber das ist leider auch nicht trivial. Da arbeite ich lieber weiter an der richtigen Lösung.
Hatte halt die Hoffnung, dass es da einen einfachen Schalter gibt.
Das ich migrieren muss ist mir klar.
Werde ich tun.
Ich hatte nur gehofft, einen sehr schnelle fix zu finden, denn die Migration wird ein wenig dauern und bis dahin funktioniert die Duplikatserkennung nicht mehr richtig. Das Produkt ist komplex und wir releasen nicht alle paar Tage. Einen Hotfix könnte ich schnell nachschieben, die Migration nicht.
Der Algorithmus, den der DeflateStream verwendet hat sich geändert. Vermutlich mit Framework 4.7.2, genau weiß ich es nicht. Meine Anwendung ist für 4.6.1 gebaut, trotzdem hat sich das Verhalten geändert.
Mein Problem: Ich speichere Daten komprimiert und nicht doppelt. Die Id für einen Stream habe ich aus dem Hash des komprimierten Streams gebildet. Damit kann ich nach Duplikaten suchen. Solange der Algorithmus sich nicht geändert hat, hat das funktioniert.
Jetzt nicht mehr. Wird jetzt ein Dokument komprimiert, dass ich früher schonmal hatte, sieht der komprimierte Stream anders aus und hat einen anderen hash. Ich finde also das Duplikat nicht mehr.
Die saubere Lösung für mich wäre, den Hash des Originals zu verwenden. Nun habe ich aber schon Millionen alte Datensätze, für die ein Update nicht mal eben schnell gemacht ist.
Daher würde ich gerne als Zwischenlösung auf den alten Algorithmus zurückgreifen.
Weiß jemand, ob und wie das geht?
Ich habe folgenden Schalter gefunden, der leider nicht hilft:
Danke für den Tip. Ich sollte mich also mit MVC befassen!? Kennst Du da ein gutes Tutorial? Ist das wesentlich anders als asp.net? Kann man das kombinieren?
Und ich hatte gehofft es ginge mit asp.net und ajax.
Ich kann mir einfach nicht vorstellen, dass es kein Ajax-Control gibt, mit dem man genau das machen kann. Das ist doch keine exotische sondern eher eine alltägliche Anforderung, die ich da habe. Da kann es doch nicht wirklich sein, dass ich mir da was selber schustern muss. Da kann ich ja gleich noch eben das Rad neu erfinden...
Vielleicht hätte ich noch erwähnen sollen, das ich mit asp.net arbeite?
Ich habe ein UserControl in dem ich im PageLoad 20 Datensätze Lade und daraus Controls generiere, die ich in das UserControl einbette.
Nun möchte ich wie beschrieben per AJAX weitere nachladen können und weiß leider nicht was für ein Control ich dafür verwenden soll...
Ich habe eine wie ich denke einfache Aufgabe und sehe wahrscheinlich den Wald vor lauter Bäumen nicht.
Meine Webanwendung ist mit einem Explorer zu vergleichen. Es gibt zwei Spalten. Links werden Ordner und Dateien angezeigt, rechts Details.
Klicke ich auf eine Datei, wird die rechte seite aktualisiert (die Details zur Datei werden rechts angezeigt).
Beim Klick auf einen Ordner wird die linke Seite aktualisiert. Unterordner und Dateien des gewählten Ordners werden links angezeigt.
Hierfür benutze ich UpdatePanels um nicht immer alles neu zu laden.
Nun zeige ich links allerdings nicht alle Einträge an, sondern nur die ersten 20. Wenn es mehr gibt, kommt darunter ein Link "weitere Elemente nachladen".
Beim Klick auf diesen Link sollen die nächsten 20 Einträge in der linken Liste hinzugefügt werden. Ich habe mir das Ajax Control Toolkit angesehen, finde aber kein Control, das dafür gedacht zu sein scheint. Mit DynamicPopulate ersetzt man Inhalte, aber lädt nicht welche dazu, oder verstehe ich da was falsch? Kann mir jemand sagen, mit welchem Control das geht? Gibt es irgendwo ein gutes Beispiel?
Habe jetzt schon 'ne weile gegoogelt, aber ich scheine wohl nicht die richtigen Begriffe zu verwenden, jedenfalls finde ich nichts gescheites...
Wenn die letzten Elemente nachgeladen wurden, soll optimalerweise der Link verschwinden.
Blättern würde mit einem UpdatePanel gehen, aber das soll es nicht sein. Es sollen bei Bedarf weitere Elemente nachgeladen werden, ohne das die bisherigen verschwinden.
Guter Einwand. Das zeigt nochmal, dass man genau wissen muss, was man eigentlich möchte.
gfoidls Metode liefert übrigens auch nur dann true zurück, wenn man das eps_a entsprechend groß wählt.
Eine wichtige Frage, die man sich stellen muss ist, ob man wirklich eine sehr kleine negative und eine sehr kleine positive Zahl als gleich sehen möchte. Das hängt stark vom Kontext ab.
Wenn man dies nicht möchte, sollte man für absEps bzw. eps_a double.Epsilon setzen wenn man wenigstens -0 und 0 als gleich ansehen möchte.
Soll sogar -0 und 0 als verschieden angesehen werden, setzt man 0 für absEps ein.
Das ist mMn nicht richtig. Diese Prüfung ist nur bei Zahlen verschieden Vorzeichens sinnvoll. gfoidl hat sie ja genau zu dem Zweck eingebaut, dass zwei Zahlen die näherungsweise 0 sind aber sich im Vorzeichen unterscheiden als gleich angesehen werden können.
Wenn man mit gfoidls Methode zwei Zahlen gleichen Vorzeichens mit einem Absolutbetrag kleiner eps_a vergleicht werden sie immer als gleich angesehen. Auch wenn der relative Unterschied sehr groß ist.
Wenn man das verhindern möchte, muss man die Vorzeichen prüfen. Und wenn man das schonmal tut, muss man nicht mehr Abs verwenden.
Die Methode muss auch nicht unbedingt 'übersichtlich' sein. Wichtiger ist doch, dass sie korrekt und möglichst performant ist.
Du könntest z.B. ermitteln welche Konoten entfernt, welche hinzugefügt und welche geändert werden müssen und dann sie entsprechend entfernen, hinzufügen und ändern. Dann bleibt der Baum offen.
Bei der zweiten Variante (Vergleich der signifikanten Stellen) vermute ich ein Problem:
Wenn wir mit Zahlen mit extremen Exponenten arbeiten, können wir sie nach der Multiplikation noch immer nicht in long wandeln. Müssen wir nicht zunächst den Exponenten wegbekommen und erst danach multiplizieren?
Wenn Du mit Deiner Methode zwei sehr kleine Zahlen vergleichst sind die dann immer gleich und sehr große Zahlen sind es nie...
Das epsilon muss schon relativ zu den Zahlen sein.
Man muss es also berechnen. Math.Abs muss man auch verwenden...
Von der Performance her dürfte dass nicht gerade besser sein, oder?
ich habe mir eine Extension-Method geschrieben, die vergleichen soll, ob zwei double Werte näherungsweise (bis auf die letzten beiden Stellen) gleich sind.
Nun hätte ich gerne Eure Meinung, ob die so funktioniert, ob es wohl Fälle geben kann, in denen sie nicht funktioniert...
Hier die Methode:
public static bool ApproximatelyEquals(this double value, double other)
{
if (value == other) return true;
if (value ≥ .0)
if (other > value) return value * 1.0000000000001 ≥ other;
else if (other ≥ .0) return other * 1.0000000000001 ≥ value;
else return value < 0.0000000000001 && other > -0.0000000000001;
if (other < .0)
if (other > value) return other * 1.0000000000001 ≤ value;
else return value * 1.0000000000001 ≤ other;
return other < 0.0000000000001 && value > -0.0000000000001;
}
Ich benutze eine ListView mit LargeIcons. Die Anzuzeigenden Bilder sind nicht quadratisch. Die längere Seite ist allerdings bei allen gleich (126).
Beispiel: (126 x 100, 126 x 110, 89 x 126, ...)
Die Bilder werden leider alle auf 126x126 gestretched. Das möchte ich verhindern. Kann mir da einer helfen?
Die LargeImageList bekommt eine ImageSize von 126x126. Daran liegt es dann wohl auch. Aber was kann ich da tun? Muss ich mir die Bilder in ein durchsichtiges Bild der Größe 126x126 zentriert reinzeichnen, und dieses dann verwenden, oder gibt es eine einfachere Lösung?
Ich habe jetzt das Problem. Die fremde exe erzeugt neben sich eine Datei.
Wenn ich das mit einer eigenen nachbilde, bekomme ich den selben Fehler.
Scheinbar wird der Service vom IIS neu gestartet sobald in einem Unterverzeichnis neue Dateien entstehen. Kann man das dem IIS abgewöhnen?
Die Anzahl der Prozesse ist vor und nach dem Aufruf der original exe übrigens gleich. Die Aufgerufene exe erzeugt also wohl keine neuen Prozesse, die hinterher noch laufen und zu Problemen führen könnten...
Der Unterschied zwischen meiner und der original exe ist u.a., dass meines ein .net Programm ist, während die andere in c++ programmiert wurde.
Leider ist die exe 'ne externe. Ich kenne den Aufbau nicht. Sie extrahiert den Volltext aus einer Datei und schreibt ihn in eine andere Datei. Ob sie dafür Hintergrundprozesse startet etc. weiß ich nicht, das müsste ich den Hersteller fragen...
Ich denke, ich muss das ganze asynchron laufen lassen.
Die Exception fange ich übrigens noch im Service wieder ab, daher keine FaultException.
Ich habe nun in die exe, die nichts tut ein Thread.Sleep(2000) eingebaut. Das dauert eindeutig länger als das Ausführen der anderen exe und ich bekomme den Fehler nicht. Es liegt also nicht an der Dauer. Es muss mit der exe zu tun haben. Die muss noch irgendwelche Nachwirkungen haben, aber wie kann das sein?
Ich habe übrigens mittlerweile die Lösung gefunden.
Ich hatte die Leserechte auf den privaten Schlüssel des Zertifikates für IIS_IUSRS gesetzt. Das war auf dem Win7 Rechner so ok. Auf dem 2008 Server musste ich die Rechte für den "NetworkService" setzen. Logisch, da ja der AppPool mit dieser Identität läuft...
Danke, Ich denke, Du hattest den richtigen Riecher. Wenn ich eine exe aufrufe, die gar nichts tut, klappt es.
Aber was ist ein internes Timeout (im Gegensatz zum Timeout das sofort eine Exception im Client erzeugt)? An welcher Schraube muss ich da drehen?
Der Prozess braucht übrigens ca 1 sec und ich sehe in den app.- und web.config Dateien keine Timeouts, die kleiner als 10sec sind.
Und wie kann es einen Timeout geben, wenn doch die Methode erfogreich beendet wird?