PDA

View Full Version : [ASP.NET]: Web Service


robs05
25-04-2009, 09:29
Salve,

Sto realizzando un web service per un progetto all'università.

Il mio problema è che ogni volta che invoco un web Method devo istanziare un oggetto della classe che ho creato.
Per l'inizializzazione di quest'oggetto sono previste molte operazioni allora non mi conviene instanziare e distruggere ogni volta che viene invocato un web method, causa una notevole perdita di efficienza.
Vorrei fare in modo che quest'oggetto resti vivo anche dopo un invocazione di un web method, in modo che quando viene richiamato un altro web method già dispone dell'oggetto (sul quale poi può fare quello che vuole) senza doverlo creare di nuovo.

Ho sentito parlare di stato del web service o web service stateful....

Come si potrebbe realizzare questa cosa? esistono classi .Net?

Grazie

Kralizek
25-04-2009, 09:33
http://www.google.se/search?hl=it&q=asp.net+web+service+stateful&btnG=Cerca+con+Google&aq=f&oq=

Il secondo risultato potrebbe fare al caso tuo ;)

Big Bamboo
25-04-2009, 10:18
potresti provare anche con il caching degli oggetti

robs05
25-04-2009, 11:45
Grazie mille, ho risolto (una parte).

Lato server :
con un metodo instanzio l'oggetto g ed invoco il metodo g.open()
di quella classe( che fà quelle operazioni che volevo far fare soltanto una volta e non ogni volta che soi invocava un metodo), poi inserisco quest' oggetto nella cash, il metodo open() restituisce il token.

Gli altri metodi, oltre ai parametri, prendono in input il token univoco e quindi ottengono dalla cash lo stesso oggetto e possono invocare i metodi senza reinvocare il metodo open();

Lato client:
Adesso ho creato l'applicazione che consuma il web service.
Ed ho incontrato un altro problemino.

ogni volta che utilizzo un controllo web la pagina viene ricaricata invocando il metodo page_load


private WS.Service ws;
private String webToken;

protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack == false)
{
ws = new WS.Service();
webToken = ws.open();
/*carico la pagina con alcuni valori restituiti
dal web service.
Es.*/
int result = ws.getValue(12,23, webToken);
String[] list = ws.getNomi(webToken);

}
}

//poi dopo aver inserito alcuni parametri in qualche textbob il metodo
//deve rchiamare un altro metodo del webservice
protected void btnOk_Click(object sender, EventArgs e)
{

lblValue.Text =
Convert.ToString(ws.getValue(txt1.text.toString(), txt2.Text.toString(), webToken));
//Il problema è che dopo aver cliccato sul bottone ok la pagina si ricarica,
//ma a causa del controllo sul IsPostBack non istanzia l'oggetto ws e
//quindi in questo metodo ws = null ed anche webToken = null , qundi
//viene sollevata un eccezione
//non posso togliere il controllo nel page_load altrimenti ritorno al
//problema che avevo prima, ovvero invocare
// ws = new WS.Service();
// webToken = ws.open();
//ad ogni caricamento pagina, quindi poi non è servito a nulla gestire
//la cash lato server
}


Ringrazio anticipatamente per qualsiasi consiglio....

robs05
25-04-2009, 12:59
Risolto, ho utilizzato la cash anche lato client

tomminno
25-04-2009, 17:14
Occhio che stai lasciando tutte le connessioni aperte finchè l'application pool non scade.

robs05
26-04-2009, 00:17
No no non ti preocccupare, svuoto sia la cache e chiudo le connessioni, ad ogni g.open() corrisponde un g.close().

Grazie per l'osservazione