Como posso saber no lado do cliente quando o manipulador HTTP é o processamento feito?

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Provavelmente uma pergunta longa para uma solução simples, mas aqui vai ...

Eu tenho um personalizado feito controle do Silverlight para a seleção de vários arquivos e enviá-los ao servidor. Ele envia os arquivos para um manipulador geral (FileReciever.ashx) usando o método OpenWriteAsync de um controle webclient.

Basicamente, o código do Silverlight faz algo parecido com isso para cada arquivo:

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

O manipulador do lado do servidor simplesmente lê o fluxo de entrada e, em seguida, faz mais algum processamento com a matriz de bytes resultante.

O problema é que do lado do cliente OpenWriteCompleted é feito logo que todos os dados tenham sido enviados através do fio. Meu código, então, contine com o próximo arquivo. O que eu realmente quero é esperar até que o manipulador ASHX terminou com tudo o que de processamento desse pedido. Como faço isso? Qualquer mecanismo de espera em WebClient? Qualquer callback que posso fazer sobre o HttpContext no manipulador? Devo usar algum outro tipo de técnica de transferência? Por favor, conselhos!

Foi útil?

Solução

Hrm, talvez um solutioin simples poderia ser para marcar o url com um GUID (o guid ser único por arquivo, ou transferência, o que faz sentido para o seu situatuation). Então você pode ter outro serviço web simples que é capaz de verificar o status do outro serviço, com base no guid, e ter o seu consulta de cliente Silverlight que novo serviço para o seu status de processamento (passando o novo serviço web do guid da transferência passado).

Outras dicas

A mesma pergunta foi feita em Silverlight fóruns . A resposta Microsoft endossado foi que você não pode fazer isso com WebClient e OpenWriteAsync. Você precisa se quer utilizador UploadStringAsync ou um HttpWebRequest.

Eu estou assumindo que você está preocupado que os dados a serem devolvidos a partir do manipulador está levando muito tempo para a transferência e o servidor não está sendo utilizado durante esse tempo. Não há uma maneira de saber quando o servidor está processando feito, então eu não acho que você pode fazer isso sem alterar sua arquitetura.

Eu teria seu manipulador única um identificador de algum tipo (como um GUID ou int) que pode ser usado para recuperar o resultado do manipulador em outro pedido. Assim, a página iria chamar o manipulador, o manipulador seria armazenar o resultado e devolver o identificador, a página iria chamar o manipulador pela segunda vez e chamar outro manipulador para obter o resultado da primeira chamada. Esta iria manter o seu servidor em uso, enquanto os seus dados foi a transferência.

Ou você pode provavelmente fazê-lo com JavaScript (jQuery) ... se você não se importa usando JavaScript que é.

Se os arquivos não são muito grandes, e é viável para manter cada um deles na memória, uma solução feio mas eficaz é convertê-los em cordas e enviá-los usando o método UploadStringAsync.

Evite esta abordagem, se o tamanho do arquivo é ilimitado, mas se você puder agora que será relativamente pequeno, é possível usar essa abordagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top