- Windows Server 2003 - IIS 6.x
- ASP.NET 3.5 (C#)
- IE 7,8,9
- FF (was auch immer die neuesten Versionen sind 10)
Benutzerszenario:
Der Benutzer gibt Suchkriterien für große Datenmengen ein. Nach dem Einleiten der Anfrage werden sie zu einer Ergebnisseite geleitet, wo sie warten, bis die Daten geladen sind, und dann die Daten verfeinern können.
Technisches Szenario:
Nach Benutzern Suchkriterien senden (über Ajax-Aufruf), UI ruft Back-End-Service. Der Back-End-Dienst fragt Transaktionssystem (e) ab und legt die resultierenden Daten in einen db- "Cache" - eine denormalisierte Tabelle - ein, um die Daten weiter zu verfeinern (d. H. Sortieren, filtern). UI wartet, bis die Daten zwischengespeichert sind, und navigiert zu einer resultierenden Seite, nachdem sie benachrichtigt wurde, dass der Vorgang abgeschlossen ist. Die resultierende Seite ruft dann auf, um die Daten aus der denormalisierten Tabelle abzurufen.
Problem:
Die Suche ist relativ langsam (15-25 Sekunden) für große Abfragen, die viele Systeme auf den eingegebenen Kriterien abgefragt werden am Ende mit. Es ist relativ schnell für andere Abfragen (< 4 Sekunden).
Technische Einschränkungen:
Wir können nicht völlig neu Architekt diese Suche/Ergebnisse System. Es gibt viel zu viele Komplexitäten zwischen der UI und dem Back-End. Die Seite ist erforderlich (aufgrund von Einschränkungen, die in StackOverflow nicht gelöst werden können), um nach der Ausführung der Suchkriterien zu drehen.
Wir können die Organisation auch nicht bitten, die Daten vor der Suche zu denormalisieren, da die Daten in Echtzeit sein müssen, dh wenn ein Benutzer Änderungen an anderen Systemen vornimmt, müssen die Daten korrekt angezeigt werden eine Suche danach.
Prozess, der ich folgen möchten:
Ich möchte ein wenig betrügen. Ich möchte die "Cache" -Anfrage über einen asynchronen HttpHandler in einem Fire-Forget-Modell ausgeben.
Nach der Abfrage möchte ich die Seite auf die resultierende Seite überführen.
Auf der Übergangsseite möchte ich die "Cache" -Tabelle abfragen, um zu sehen, ob die Daten noch eingefügt wurden.
Der Grund, warum ich diesen Übergang sofort machen möchte, ist, dass die resultierende Seite teuer ist (auch ohne die Daten zu bekommen) - immer noch 2 Sekunden Ladezeit, bevor man den Dienst aufruft, der die Daten bekommt aus dem Cache.
Frage:
Wird der ASP.NET Thread, die Verarbeitung weiterhin zuverlässig über die Asynchron-Handler aufgerufen wird, auch wenn ich von der Seite navigieren weg ein Javascript-Weiterleitung?
Technische Grenzen 2:
Ja, ich weiß ... Dieser Suchvorgang klingt nicht effizient. Daran kann ich momentan nichts ändern. Ich versuche, alles zu tun, um es etwas besser zu machen, während wir weiter nachforschen, wie wir es umgestalten werden.
Wenn Ihre Antwort lautet: "Werfen Sie es weg und fangen Sie von vorne an", antworten Sie bitte nicht. Das ist nicht akzeptabel.
Ok, lass mich sehen, ob ich es bekommen habe. Wenn die Benutzer einige Suchkriterien senden, starten Sie die Abfrageausführung asynchron und leiten den Benutzer sofort zur Ergebnisseite um. Anschließend laden Sie auf der Ergebnisseite die Seite und überprüfen, ob die Abfrage auf dem Server beendet ist, um die Ergebnisse für den Benutzer anzuzeigen. Und Sie fragen, ob die Ausführung der asynchronen Abfrage weiterhin ausgeführt wird, wenn der Benutzer die Ergebnisseite verlässt? Ist das korrekt? –
Das ist fast richtig. Die Frage ist nicht, ob es weiter ausgeführt wird, wenn der Benutzer die Ergebnisseite verlässt, sondern eher weiter ausgeführt wird, wenn der Benutzer auf die Ergebnisseite übertragen wird. Bei dem Testen auf meinem lokalen Computer scheint die asynchrone Operation weiterhin ausgeführt zu werden. Ich möchte jedoch überprüfen, wie zuverlässig dieser Prozess ist. Ist dies das entworfene Verhalten von ASP.NET oder ein Fall von "es funktioniert auf meiner Maschine"? –
Wenn Sie den Threading-Namespace verwenden (sind Sie?), Um einige Verarbeitung asynchron auf dem Webserver auszuführen, glaube ich nicht, dass es ein "es funktioniert auf meinem Computer" Fall wäre. Es sollte auf jeden Fall wie erwartet auf IIS funktionieren. –