Ora ho qualcosa di simile:È possibile creare un servizio Web di stato in C#?
public class Service1 : System.Web.Services.WebService
{
[WebMethod]
public string Method1()
{
SomeObj so = SomeClass.GetSomeObj(); //this executes very long time, 50s and more
return so.Method1(); //this exetus in a moment
}
[WebMethod]
public string Method2()
{
SomeObj so = SomeClass.GetSomeObj(); //this executes very long time, 50s and more
return so.Method2(); //this exetus in a moment
}
...
}
E 'possibile rendere il servizio web statefull modo che io possa riutilizzare SomeObj so
e basta chiamare metodi sullo stesso oggetto?
Quindi il client che utilizzerà questo servizio chiamerebbe prima il metodo web che creerebbe l'oggetto so
e restituirà un ID. E quindi nelle chiamate successive il servizio Web riutilizzerà lo stesso oggetto so
in base all'ID.
EDIT
Ecco il mio codice vero e proprio:
[WebMethod]
public List<ProcInfo> GetProcessList(string domain, string machineName)
{
string userName = "...";
string password = "...";
TaskManager tm = new TaskManager(userName, password, domain, machineName);
return tm.GetRunningProcesses();
}
[WebMethod]
public bool KillProcess(string domain, string machineName, string processName)
{
string userName = "...";
string password = "...";
(new TaskManager(userName, password, domain, machineName);).KillProcess(processName);
}
è possibile memorizzare tutti gli oggetti nella cache o ci sono delle limitazioni? Gli oggetti personali includono connessioni WMI aperte a vari computer. – Primoz
Per impostazione predefinita, la cache viene archiviata in memoria e se si avvia in esecuzione su una memoria insufficiente verrà automaticamente rimosso. Quindi sì, puoi archiviare quanto vuoi ma devi sempre controllare che l'oggetto sia nella cache e non fare mai affidamento sul fatto che sia lì perché lo hai archiviato. –
@Darin Dimitrov, dovresti rendere sicura la tua soluzione usando un lucchetto. Mentre una richiesta sta eseguendo "result = action();" linea, che richiede tempo, qualsiasi altra richiesta vedrà anche la cache come null e ripeterà lo stesso "risultato = azione();" linea. Vedi http://en.wikipedia.org/wiki/Double-checked_locking – Sklivvz