Melhores práticas para webservices
-
08-06-2019 - |
Pergunta
Eu criei um webservice e quando quero usar seus métodos eu o instancio no procedimento a, chamo o método e finalmente o descarto, porém acho que também poderia ser bom instanciar o webservice no "private void Main_Load(objeto remetente, EventArgs e)" evento.
Acontece que se eu fizer da primeira forma terei que instanciar o webservice toda vez que precisar de um de seus métodos mas na outra forma tenho que manter um webservice conectado o tempo todo quando utilizo ele em um formulário por exemplo.
Gostaria de saber quais dessas práticas são melhores ou se existe uma maneira muito melhor de fazer isso
Estratégia 1
private void btnRead_Click(object sender, EventArgs e)
{
try
{
//Show clock
this.picResult.Image = new Bitmap(pathWait);
Application.DoEvents();
//Connect to webservice
svc = new ForPocketPC.ServiceForPocketPC();
svc.Credentials = new System.Net.NetworkCredential(Settings.UserName, Settings.Password);
svc.AllowAutoRedirect = false;
svc.UserAgent = Settings.UserAgent;
svc.PreAuthenticate = true;
svc.Url = Settings.Url;
svc.Timeout = System.Threading.Timeout.Infinite;
svc.CallMethod();
...
}
catch (Exception ex)
{
ShowError(ex);
}
finally
{
if (svc != null)
svc.Dispose();
}
}
Estratégia 2
private myWebservice svc;
private void Main_Load(object sender, EventArgs e)
{
//Connect to webservice
svc = new ForPocketPC.ServiceForPocketPC();
svc.Credentials = new System.Net.NetworkCredential(Settings.UserName, Settings.Password);
svc.AllowAutoRedirect = false;
svc.UserAgent = Settings.UserAgent;
svc.PreAuthenticate = true;
svc.Url = Settings.Url;
svc.Timeout = System.Threading.Timeout.Infinite;
}
private void btnRead_Click(object sender, EventArgs e)
{
try
{
//Show clock
this.picResult.Image = new Bitmap(pathWait);
Application.DoEvents();
svc.CallMethod();
...
}
catch (Exception ex)
{
ShowError(ex);
}
}
private void Main_Closing(object sender, CancelEventArgs e)
{
svc.Dispose();
}
Solução
Depende de quantas vezes você ligará para o serviço da web.Se você vai chamá-lo quase constantemente, provavelmente seria melhor usar o método nº 2.No entanto, se ele não for chamado com tanta frequência, é melhor usar o método nº 1 e instanciá-lo apenas quando precisar.
Outras dicas
Neste momento fiz uma solução para um dispositivo móvel e ele passa a ser usado em horários irregulares, pode ser usado em 10 minutos, 1 hora, 4 horas é muito variável, parece que a melhor abordagem é a primeira estratégia.
Ano passado entramos em um projeto onde utilizamos webservices o fato é que instanciamos nossos webservices na procedure Sub New() e funcionou muito bem porém algumas vezes alguns usuários nos reclamaram que acordaram de suas cadeiras e quando retornaram e tentaram continuar no aplicativo, receberam uma mensagem de erro de tempo limite e tiveram que fazer login novamente.
Achamos que talvez estivesse tudo bem porque talvez os usuários tenham ficado muito tempo fora de seus assentos, mas uma vez em uma apresentação do aplicativo com os CEOs aconteceu exatamente o mesmo cenário e pessoalmente não gostei desse comportamento e é por isso que a pergunta.
Obrigado pela resposta.