Migliori pratiche per i servizi web
-
08-06-2019 - |
Domanda
Ho creato un webservice e quando voglio usare i suoi metodi lo istanziamo nella procedura a, chiamo il metodo, e alla fine lo dispongo, comunque penso che potrebbe anche andare bene istanziare il webservice nel "private void" Evento Main_Load(mittente oggetto, EventArgs e)".
Il fatto è che se lo faccio nel primo modo devo istanziare il servizio web ogni volta che ho bisogno di uno dei suoi metodi, ma nell'altro modo devo mantenere un servizio web sempre connesso quando lo uso in un modulo, ad esempio.
Vorrei sapere quale di queste pratiche è migliore o se esiste un modo molto migliore per farlo
Strategia 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();
}
}
Strategia 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();
}
Soluzione
Dipende dalla frequenza con cui chiamerai il servizio web.Se lo chiamerai quasi costantemente, probabilmente sarebbe meglio usare il metodo n. 2.Tuttavia, se non verrà chiamato così spesso, è meglio utilizzare il metodo n. 1 e istanziarlo solo quando ne hai bisogno.
Altri suggerimenti
In questo momento ho realizzato una soluzione per un dispositivo mobile e risulta essere utilizzata in tempi irregolari, potrebbe essere utilizzata in 10 minuti, 1 ora, 4 ore è molto variabile, sembra che l'approccio migliore sia la prima strategia.
L'anno scorso abbiamo intrapreso un progetto in cui utilizzavamo i servizi web, il fatto è che abbiamo istanziato i nostri servizi web nella procedura Sub New() e lo ha eseguito molto bene, tuttavia, a volte alcuni utenti ci hanno affermato di essersi svegliati dalla sedia e quando sono tornati e hanno provato a continuare con l'applicazione, hanno ricevuto un messaggio di errore di timeout e hanno dovuto effettuare nuovamente l'accesso.
Abbiamo pensato che forse andava bene perché forse gli utenti sono rimasti per molto tempo fuori dai loro posti, ma una volta in una presentazione dell'applicazione con gli amministratori delegati si è verificata esattamente la stessa situazione e personalmente non mi è piaciuto quel comportamento e ecco perché la domanda.
Grazie per la risposta.