Pergunta

Eu tenho um serviço web ASP.NET que faz algum trabalho pesado, como por exemplo, algumas operações de arquivo, ou a geração de planilhas do Excel a partir de um monte de relatórios de cristal. Eu não quero ser bloqueado, chamando este serviço web, assim que eu quero fazer a assíncrona chamada de serviço web. Além disso, eu quero chamar este serviço web a partir de uma página web, e querem algum mecanismo que vai permitir-me para manter interrogar o servidor para que eu possa i pode mostrar algum indicador de progresso na tela, como por exemplo, o número de arquivos que tem sido processada. Por favor note que eu não quero uma notificação sobre a conclusão da chamada de método web, em vez disso, eu quero um estado de progresso ao vivo. Como faço para ir sobre ele?

Foi útil?

Solução

Escrever um método separado no servidor que você pode consultar, passando o ID do trabalho que foi programado e que retorna um valor aproximado entre 0-100 (ou 0,0 e 1,0, ou qualquer outro) de quanto tempo é .

por exemplo. em REST estilo, você poderia fazer uma solicitação GET para http://yourserver.com/app/jobstatus/4133/ que retornaria um simples '52' como text/plain. Então você só tem que consulta que cada (segundo? Dois segundos? Dez segundos?) Para ver quanto tempo ele é.

Como você realmente realizar o monitoramento no backend altamente depende do que o seu processo é e como funciona.

Outras dicas

Eu acho que o serviço XML Web é lento, por isso a criação de vários métodos e polling o progresso será extremamente lento e irá gerar enorme carga sobre o servidor. Eu não iria fazê-lo em ambiente de produção. Eu vejo os mesmos (mas menor) problemas com polling banco de dados.

Tente extensões SABÃO em seu lugar. Ele implementa um modelo orientado a eventos. Consulte Adicionando uma barra de progresso para o seu Web Application Service Cliente no MSDN .

Você também pode uso SoapExtensions para notificar o cliente do download / andamento do processo. O servidor pode então enviar eventos para o cliente. Nada no cliente tem que ser mudado, se você não usá-lo.

Permite algo assim em seu cliente:

//...
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...
}

Tenha a chamada de serviço web "iniciar a geração de relatórios" inicial criar uma tarefa em alguns piscina tarefa, e retornar ao chamador a ID da tarefa.

Em seguida, fornecer um outro método que retorna o "por cento feito" para um determinado taskId.

Fornecer um terceiro método que retorna o resultado real para uma tarefa concluída.

A maneira mais fácil seria a de ter o serviço Web atualizar um campo em um banco de dados com o progresso da chamada e, em seguida, criar um Web Service que as consultas nesse campo e retorna o valor.

Faça o serviço web para retornar algum tipo de ID de tarefa ou ID da sessão. Faça outro método web para consulta com esse ID, que retorna a informação necessária (% de conclusão, lista de arquivos, qualquer que seja). Sondar este método em algum intervalo a partir do cliente.

Use um banco de dados para armazenar as informações do processo, se você fizer isto em memória do serviço web, este não escala bem em ambiente de farm web, como pode acontecer que a tarefa é executada em outro servidor, do que o que você está polling.

EDIT: Eu só vi uma outra resposta semelhante, e comentar a ele. O comentarista é certo -. Você pode usar a tabela em memória para operações de disco evitar, mas ainda usando um servidor db separado

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