Frage

Ich habe einen ASP.NET Web-Service, die einig schweres Heben tut, wie etwa einige Dateioperationen oder Erzeugen von Excel Sheets aus einem Bündel von Crystal Reports. Ich will nicht durch den Aufruf dieser Web-Dienst gesperrt werden, so dass ich möchte, um die Web-Service-Aufruf asynchron machen. Außerdem möchte ich diese Web-Service aus einer Web-Seite aufzurufen, und einen Mechanismus wollen, die mir erlauben, Polling, den Server zu halten, so dass ich ich einige Indikator für Fortschritte auf dem Bildschirm zeigen kann, wie beispielsweise die Anzahl der Dateien, die verarbeitet worden sind. Bitte beachten Sie, dass ich keine Benachrichtigung bei Abschluss des Web-Methode aufrufen wollen, vielmehr möchte ich eine Live-Fortschritt-Status. Wie gehe ich davon?

War es hilfreich?

Lösung

Schreiben Sie eine separate Methode auf dem Server, den Sie, indem Sie die ID des Auftrags abfragen können, die geplant wurde, und die gibt einen ungefähren Wert zwischen 0-100 (oder 0,0 und 1,0, oder was auch immer) von wie weit es ist .

z. in REST-Stil, könnten Sie eine GET-Anfrage an http://yourserver.com/app/jobstatus/4133/ machen, die ein einfaches ‚52‘ als text/plain zurückkehren würde. Dann müssen Sie nur noch abfragen, dass alles (zweiten? 2 Sekunden? 10 Sekunden?), Um zu sehen, wie weit es ist.

Wie Sie tatsächlich die Überwachung auf dem Backend zu erreichen, hängt enorm ab, was Ihr Prozess ist und wie es funktioniert.

Andere Tipps

ich denke, XML Web Service ist langsam, so Erstellung mehrerer Methoden und Abfrage der Fortschritt wird extrem langsam und große Last auf dem Server generieren. Ich würde es in der Produktionsumgebung nicht. Ich sehe die gleichen (aber kleinere) Probleme mit Datenbank-Abfrage.

Versuchen Sie SOAP-Erweiterungen statt. Es implementiert ein ereignisgesteuertes Modell. Siehe Hinzufügen eines Fortschrittsbalken auf Ihre Web-Service-Client-Anwendung auf MSDN .

Sie können auch Verwendung SoapExtensions Ihr Client des Download benachrichtigen / Prozessfortschritt. Der Server kann dann Ereignisse an den Client senden. Nichts in dem Client geändert werden muss, wenn Sie es nicht verwenden.

Ermöglicht für so etwas in Ihrem Client:

//...
private localhost.MyWebServiceService _myWebService = new localhost.MyWebServiceService ();
_myWebService.processDelegate += ProgressUpdate;
_myWebService.CallHeavyMethod();
//...

private void ProgressUpdate(object sender, ProgressEventArgs e)
{
  double progress = ((double)e.ProcessedSize / (double)e.TotalSize) * 100.00;
  //Show Progress...
}

Haben die anfängliche „Start Berichterstellung“ Web-Service-Aufruf eine neue Aufgabe in einigen Aufgabenpool erstellen, und gibt die ID der Aufgabe, den Anrufer.

Dann stellen eine weitere Methode, die die „Prozent fertig“ für einen bestimmten taskId zurückgibt.

ein drittes Verfahren, die die tatsächliche Ergebnis für eine erledigte Aufgabe zurückgibt.

Die einfachste Weg wäre, um den Web-Service auf einer Datenbank ein Feld mit dem Fortschritt des Anrufs aktualisieren, und dann einen Web-Service erstellen, die das Feld abfragt und gibt den Wert.

Machen Sie den Web-Service eine Art Task-ID oder Sitzungs-ID zurück. Machen Sie eine andere Web-Methode mit dieser ID abfragen, die die Informationen liefert benötigt (% Fertigstellung Liste der Dateien, was auch immer). Poll diese Methode zu einem bestimmten Intervall vom Client aus.

eine Datenbank Verwenden Sie die Prozess zum Speichern von Informationen, wenn Sie diese von dem Web-Service in Erinnerung zu tun, wird dies nicht skaliert gut in Webfarmumgebung, wie es passieren kann, dass die Aufgabe auf einem anderen Server läuft, als Sie sind Polling.

EDIT: Ich habe gerade gesehen, eine ähnliche Antwort, und kommentieren zu. Der Kommentator ist richtig -. Sie In-Memory-Tabelle verwenden können, um Plattenoperationen zu vermeiden, aber immer noch einen separaten DB-Server mit

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top