Wednesday, November 19, 2008

Chamando um web services que não tem retorno

Esses dias me deparei com um problema em um dos web services que estava criando aqui: eu deveria chamar o web service mas nao precisava esperar o seu retorno pois o web service era uma sub (ou void). Imagine o seguinte cenário: toda noite minha aplicação precisa chamar um web service que processa alguns dados e atualiza o banco de dados com algumas estatisticas. Agora imagine que voce precisa disparar dois processos desses em paralelo, dispara um web service e em seguida dispara o outro sem precisar esperar a conclusao do primeiro. Mesmo sendo um metodo sub (ou com retorno void) o processo que chamou o web service precisará aguardar a mensagem de retorno (http 200) que só chegará quando o web service terminar a execuçao para dai chamar o segundo.

Para resolver esse problema podemos adicionar um atributo ao web service informando que aquele método nao irá retornar nada, entao o segundo web service será chamado logo em seguida (em outras palavras, o processamento continua, nao fica esperando o retorno do web service). Essa chamada é conhecida como OneWayCall. Veja como fica a declaração do web method:

using System.Web.Services;
using System.Web.Services.Protocols;

public class Stats: WebService
{
[SoapDocumentMethod(OneWay=true)]
[WebMethod()]
public void GeraRelatorio1() {
// Codifique aqui
}
}

A chamada para um web services One Way Call é a mesma para um web service normal.

Esse truque funciona como uma chamdaa assincrona "fake", mas pode ajudar em diversos cenários. Voce pode ter o mesmo efeito fazendo chamadas assincronas "reais" mas vai dar um pouco mais de trabalho.

Outro caso que a chamada oneWayCall me ajudou foi quando precisei disparar um processamento no banco de dados e logo em seguida enviar uma mensagem ao usuário informando que o processamento estava sendo feito e liberar a aplicação para que o usuario pudesse continuar fazendo outras coisas.

Para se aprofundar :http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapdocumentmethodattribute.oneway.aspx

Have Fun!

No comments: