2009-03-14 10 views
1

Ich habe eine ASPX-Webanwendung, die Dateien in einer Datenbank aktualisiert oder hinzufügt. Die Clients greifen über den Browser zu, und eine der Voraussetzungen ist, dass sie das Update starten und den Browser schließen können, während das Update fortgesetzt wird. Es scheint ein wenig zu laufen, nachdem ich den Browser geschlossen habe, aber dann stoppt es. Wie können Sie die Anwendung für asp.net laufen lassen?Halten Sie meine Web-App ausgeführt, nachdem Browser schließen

Antwort

3

Das können Sie sehr gut mit WF (Workflow Foundation) lösen. Erstellen Sie einen Arbeitsablauf für die Aufgabe, die das Schließen des Browsers überleben sollte. Workflows haben ihre eigenen Threads und Livezyklen getrennt von ASP.NET.

0

Ich würde einen separaten Windows-Dienst erstellen, auf den Sie Aufträge aus Ihrer Webanwendung übertragen können, und dann den Status der Aufträge prüfen, wenn sich der Benutzer erneut anmeldet.

Der Windows-Dienst ist nicht an die asp.net-Anwendungsdomäne gebunden, sodass er weiterhin ausgeführt wird, unabhängig davon, was in Ihrer Webanwendung passiert.

1

Die Webanwendung wird weiterhin im Anwendungspool ausgeführt, wird jedoch eventuell erneut verwendet. Solange die Benutzersitzung ausgeführt wird, sollte die Anwendung am Leben gehalten werden, also können Sie das Problem beheben, indem Sie das Sitzungszeitlimit erhöhen.

Ein besserer Ansatz wäre jedoch, die langwierige Aufgabe in einen Dienst zu verschieben, aber das erfordert möglicherweise eine Neuschreibung Ihrer Anwendung.

1

In der Regel für lang andauernde oder asynchrone Verarbeitung möchten Sie die Anforderung an einen Back-End-Dienst zu behandeln, um zu behandeln. Der Versuch, die Web-App am Leben zu erhalten, um die Verarbeitung zu beenden, kann zu Problemen führen, insbesondere bei HTTP- und Session-Timeouts.

Ein gängiges Muster dafür ist, die Anforderung in eine Nachrichtenwarteschlange zu stellen und sie von einem Back-End-Dienst verarbeiten zu lassen, wenn dies möglich ist.

+0

Whoops, zu langsam –

0

Ich habe in dieses Muster gelaufen, und Sie müssen die Arbeit von der HTTP-Anfrage entkoppeln. Die Art und Weise, wie wir es gelöst haben, besteht darin, das Computing, das zu tun ist, als ein zu planendes Ereignis zu abstrahieren. Nehmen wir an, ein Benutzer in einem Browser nimmt eine Aktion vor, die eine relativ lange Berechnung (relativ) am Backend erfordert. Diese Berechnung erhält einen Namen wie 'doXYZForUser' und einen Parametervektor wie (userId, params ...) und in die Arbeitswarteschlange gesendet. In der Zukunft meldet sich der Benutzer wieder an und kann sehen, welchen Status sein Job hat.

Ich verwende einen Java-Stack und einen Java Message Service (JMS), aber das Prinzip ist das gleiche. Die Anfrage vom Browser stellt ein Ereignis in die Warteschlange und der Browser erhält eine Bestätigung, dass das Ereignis in der Arbeitswarteschlange ist. Die Warteschlange wird von einem komplett separat laufenden Prozess verwaltet, der in .NET meiner Meinung nach nur Message Queue genannt wird. Der Job wird in der Warteschlange verarbeitet und die Ergebnisse können in einer separaten Tabelle mit einem Verweis auf den Benutzer abgelegt werden, der den Job gestartet hat. Bei der nächsten Anmeldung können Jobstatus/Ergebnisse zurückgegeben werden.