Wie kann ich auf der Client-Seite wissen, wenn die HTTP-Handler der Verarbeitung erfolgt?

StackOverflow https://stackoverflow.com/questions/152618

  •  02-07-2019
  •  | 
  •  

Frage

Wahrscheinlich eine lange Frage nach einer einfachen Lösung, aber hier geht ...

Ich habe ein Maß Silverlight-Steuerung für mehrere Dateien auswählen und sie an den Server sendet. Es sendet Dateien an einen allgemeinen Handler (FileReciever.ashx) die OpenWriteAsync Methode einer WebClient-Steuerung.

Grundsätzlich ist der Silverlight-Code tut so etwas wie dies für jede Datei:

WebClient client = new WebClient();
client.OpenWriteCompleted += (sender, e) =>
  {
    PushData(data, e.Result);
    e.Result.Close();
    data.Close();
  };
client.OpenWriteAsync(handlerUri); 

Die Server-Seite-Handler lesen einfach den ankommenden Strom, und dann tun etwas mehr Verarbeitung mit dem resultierenden Byte-Array.

Das Problem ist, dass Client-Seite OpenWriteCompleted so schnell erfolgt, da alle Daten über den Draht gesendet wurden. Mein Code wird dann mit der nächsten Datei contine. Was ich wirklich will, ist zu warten, bis der ASHX Handler mit allen Verarbeitung dieser Anforderung ist es fertig ist. Wie mache ich das? Jeder Wartemechanismus auf WebClient? Jeder Rückruf ich auf der Httpcontext in dem Handler tun kann? Soll ich eine andere Art von Übertragungstechnik verwenden? Bitte Beratung!

War es hilfreich?

Lösung

Hrm, vielleicht ein einfaches solutioin könnte die URL mit einer GUID (die GUID eindeutig ist pro Datei oder übertragen, was auch immer Sinn zu Ihrer situatuation macht) zu markieren. Dann können Sie ein weiteren einfachen Web-Service haben, die Kontrolle über den Status des anderen Dienstes der Lage ist, auf der Basis der GUID und haben Ihre Silverlight-Client-Abfrage, die neue Service für seinen Bearbeitungsstatus (durch den neuen Web-Service der GUID des vorbei Vergangenheit Transfer).

Andere Tipps

Die gleiche Frage stellt sich in Silverlight Foren gefragt worden. Die Microsoft unterstützt Antwort war, dass man nicht mit WebClient und OpenWriteAsync tun können. Sie müssen entweder vom Benutzer UploadStringAsync oder ein HttpWebRequest.

Ich gehe davon aus, dass Sie befürchten, dass die Daten aus dem Handler zurückgegeben werden, eine lange Zeit zu übertragen, und der Server während dieser Zeit nicht genutzt wird. Es gibt keine Möglichkeit zu sagen, wenn der Server die Verarbeitung durchgeführt wird, so dass ich glaube nicht, dass Sie diese Ihre Architektur ohne Änderung tun können.

Ich würde Ihre Handler nur eine Kennung irgendeiner Art (wie eine GUID oder int), die verwendet werden können, um das Ergebnis der Prozedur in einer anderen Anforderung abzurufen. So ist die Seite der Handler nennen würde, würde der Handler das Ergebnis speichern und die Kennung zurückkehren, würde rufen die Seite der Handler zum zweiten Mal und einen anderen Handler rufen Sie das Ergebnis des ersten Anruf zu erhalten. Dies würde den Server in Gebrauch halten, während Ihre Daten wurden übertragen.

Oder Sie können es wahrscheinlich mit JavaScript (jQuery) ... wenn Sie nichts dagegen haben mit Hilfe von JavaScript, das ist.

Wenn Dateien sind nicht sehr groß, und machbar ist jeden von ihnen im Gedächtnis zu behalten, eine hässliche, aber effektive Lösung wird sie in Strings konvertiert und sendet sie die UploadStringAsync Methode.

Vermeiden Sie diese Methode, wenn die Dateigröße unbeschränkt ist, aber wenn man jetzt, dass sie relativ klein sein wird, ist es möglich, diesen Ansatz zu verwenden.

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