Come posso sapere sul lato client quando l'elaborazione del gestore HTTP è terminata?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Probabilmente una lunga domanda per una soluzione semplice, ma qui va ...

Ho un controllo silverlight fatto su misura per selezionare più file e inviarli al server. Invia file a un gestore generale (FileReciever.ashx) utilizzando il metodo OpenWriteAsync di un controllo WebCLient.

Fondamentalmente, il codice silverlight fa qualcosa del genere per ogni file:

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

Il gestore lato server legge semplicemente il flusso in entrata, quindi esegue un po 'più di elaborazione con l'array di byte risultante.

IL PROBLEMA è che OpenWriteCompleted sul lato client viene eseguito non appena tutti i dati sono stati inviati via cavo. Il mio codice verrà quindi contine con il file successivo. Quello che voglio veramente è aspettare fino a quando il gestore ASHX ha terminato con tutta la sua elaborazione di quella richiesta. Come lo faccio? Qualche meccanismo di attesa su WebClient? Qualche callback che posso fare su HttpContext nel gestore? Dovrei usare qualche altro tipo di tecnica di trasferimento? Per favore, consigli!

È stato utile?

Soluzione

Hrm, forse un semplice solutioin potrebbe essere quello di taggare l'URL con un GUID (la guida è unica per file o trasferimento, qualunque cosa abbia senso per la tua situazione). Quindi è possibile disporre di un altro semplice servizio Web in grado di verificare lo stato dell'altro servizio, in base al guid, e fare in modo che il client silverlight richieda quel nuovo servizio per il suo stato di elaborazione (passando il nuovo servizio Web al guid del trasferimento passato).

Altri suggerimenti

La stessa domanda è stata posta in Silverlight forum . La risposta approvata da Microsoft è stata che non è possibile farlo con WebClient e OpenWriteAsync. È necessario l'utente UploadStringAsync o un HttpWebRequest.

Suppongo che tu sia preoccupato che i dati restituiti dal gestore stiano impiegando molto tempo per il trasferimento e che il server non venga utilizzato durante quel periodo. Non c'è modo di sapere quando il server ha terminato l'elaborazione, quindi non penso che tu possa farlo senza cambiare la tua architettura.

Avrei il tuo gestore solo un identificatore di qualche tipo (come un GUID o int) che può essere usato per recuperare il risultato del gestore in un'altra richiesta. Quindi la pagina chiamerebbe il gestore, il gestore memorizzerebbe il risultato e restituirebbe l'identificatore, la pagina chiamerebbe il gestore la seconda volta e chiamerebbe un altro gestore per ottenere il risultato della prima chiamata. Ciò manterrebbe il server in uso durante il trasferimento dei dati.

O probabilmente puoi farlo con JavaScript (jQuery) ... se non ti dispiace usare JavaScript che è.

Se i file non sono molto grandi ed è possibile mantenerli in memoria, una soluzione brutta ma efficace è convertirli in stringhe e inviarli utilizzando il metodo UploadStringAsync.

Evita questo approccio se la dimensione del file è illimitata, ma se puoi ora che saranno relativamente piccoli, è possibile utilizzare questo approccio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top