Comment puis-je savoir côté client lorsque le traitement du gestionnaire HTTP est terminé?

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

  •  02-07-2019
  •  | 
  •  

Question

Probablement une longue question pour une solution simple, mais voilà ...

J'ai un contrôle silverlight personnalisé pour la sélection de plusieurs fichiers et leur envoi au serveur. Il envoie des fichiers à un gestionnaire général (FileReciever.ashx) à l'aide de la méthode OpenWriteAsync d'un contrôle WebCLient.

En gros, le code silverlight fait quelque chose comme ceci pour chaque fichier:

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

Le gestionnaire côté serveur lit simplement le flux entrant, puis effectue un traitement supplémentaire avec le tableau d'octets résultant.

LE PROBLÈME est que OpenWriteCompleted côté client est effectué dès que toutes les données ont été envoyées par le réseau. Mon code continuera alors avec le fichier suivant. Ce que je veux vraiment, c'est attendre que le gestionnaire ASHX ait terminé le traitement de cette demande. Comment je fais ça? Un mécanisme d'attente sur WebClient? Tout rappel que je peux faire sur le HttpContext dans le gestionnaire? Devrais-je utiliser une autre technique de transfert? S'il vous plaît des conseils!

Était-ce utile?

La solution

Hm, peut-être une solution simple pourrait-elle être de baliser l’URL avec un GUID (le GUID étant unique par fichier ou par transfert, quel que soit le sens de votre situation). Ensuite, vous pouvez disposer d’un autre service Web simple capable de vérifier l’état de l’autre service, en fonction du GUID, et demander à votre client Silverlight d’interroger ce nouveau service sur son statut de traitement (en transmettant au nouveau service Web le GUID du système). transfert passé).

Autres conseils

La même question a été posée dans les forums de Silverlight. La réponse approuvée par Microsoft était que vous ne pouvez pas faire cela avec WebClient et OpenWriteAsync. Vous devez utiliser l'utilisateur UploadStringAsync ou un HttpWebRequest.

Je suppose que vous craignez que les données renvoyées par le gestionnaire prennent beaucoup de temps à transférer et que le serveur ne soit pas utilisé pendant cette période. Il n’existe aucun moyen de savoir quand le traitement du serveur est terminé. Je ne pense donc pas que vous puissiez le faire sans changer votre architecture.

Je n’aurais pour votre gestionnaire qu’un identifiant quelconque (comme un GUID ou un int) pouvant être utilisé pour extraire le résultat du gestionnaire dans une autre demande. Pour que la page appelle le gestionnaire, le gestionnaire stocke le résultat et renvoie l'identificateur, la page appelle le gestionnaire une deuxième fois et appelle un autre gestionnaire pour obtenir le résultat du premier appel. Votre serveur resterait ainsi utilisé pendant le transfert de vos données.

Ou vous pouvez probablement le faire avec JavaScript (jQuery) ... si le fait d'utiliser JavaScript ne vous dérange pas.

Si les fichiers ne sont pas très volumineux et qu'il est possible de les conserver en mémoire, une solution à la fois efficace et désagréable consiste à les convertir en chaînes et à les envoyer à l'aide de la méthode UploadStringAsync.

Évitez cette approche si la taille du fichier n'est pas limitée, mais si vous pouvez maintenant qu'elle sera relativement petite, il est possible d'utiliser cette approche.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top