Domanda
Utilizzo spesso il servizio web in questo modo
public void CallWebservice()
{
mywebservice web = new mywebservice();
web.call();
}
ma a volte lo faccio
private mywebservice web;
public Constructor()
{
web = new mywebservice();
}
public void CallWebservice()
{
web.call();
}
Il secondo approccio mi piace molto ma a volte va in timeout e devo riavviare l'applicazione, il primo credo porti un sovraccarico e non sia molto efficiente, infatti a volte la prima chiamata restituisce una WebException - ConnectFailure (I non so perché).
Ho trovato un articolo (Problemi del servizio Web (una luce alla fine del tunnel?)) che supera il timeout trasformando la proprietà KeepAlive in false nella funzione sostituita GetWebRequest, ecco il codice:
Protected Overrides Function GetWebRequest(ByVal uri As System.Uri) As System.Net.WebRequest
Dim webRequest As Net.HttpWebRequest = CType(MyBase.GetWebRequest(uri), Net.HttpWebRequest)
webRequest.KeepAlive = False
Return webRequest
End Function
La domanda è: è possibile estendere per sempre il timeout del servizio web e, infine, come implementare i servizi web per gestire questo problema?
Soluzione
Le classi generate da Visual Studio per i servizi Web sono solo proxy con poco stato, quindi crearle è piuttosto economico.Non mi preoccuperei del consumo di memoria per loro.
Se quello che stai cercando è un modo per chiamare il webmethod in una riga puoi semplicemente farlo:
new mywebservice().call()
Saluti