Gestione dello stato nei servizi Web XML creati con ASP.NET

Quando la classe con cui si implementa un servizio Web XML deriva dalla classe WebService, il servizio Web XML presenterà le stesse opzioni di gestione dello stato delle altre applicazioni ASP.NET. La classe WebService contiene molti degli oggetti ASP.NET comuni, inclusi gli oggetti Session e Application.

L'oggetto Application fornisce un meccanismo per la memorizzazione dei dati accessibile a tutto il codice eseguito dall'applicazione Web, mentre l'oggetto Session consente di memorizzare i dati sulla base delle singole sessioni client. Se il client supporta i cookie, la sessione client può essere identificata da un cookie. I dati memorizzati nell'oggetto Session sono disponibili solo se la proprietà EnableSession dell'attributo WebMethod è impostata su true per le classi che derivano da WebService. Tali classi dispongono di un accesso automatico all'oggetto Application.

Per accedere allo stato specifico di una sessione client e memorizzarlo

  1. Dichiarare un servizio Web XML.

    <%@ WebService Language="C#" Class="ServerUsage" %>
    [Visual Basic]
    <%@ WebService Language="VB" Class="ServerUsage" %>
    
  2. Aggiungere un riferimento allo spazio dei nomi System.Web.Services.

    using System.Web.Services;
    [Visual Basic]
    Imports System.Web.Services
    
  3. Derivare la classe che implementa il servizio Web XML da WebService.

    public class ServerUsage : WebService 
    [Visual Basic]
    Public Class ServerUsage : Inherits WebService
    
  4. Dichiarare un metodo del servizio Web XML e impostare la proprietà EnableSession dell'attributo WebMethod su true.

    [ WebMethod(EnableSession=true) ]
    public int PerSessionServiceUsage()
    [Visual Basic]
    < WebMethod(EnableSession:=True) > _
    Public Function PerSessionServiceUsage() As Integer
    
  5. Memorizzare lo stato nell'oggetto Session, specificando il nome dello stato per poterlo recuperare in seguito. Nell'esempio seguente il valore 1 viene memorizzato in una variabile di stato denominata MyServiceUsage.

    Session["MyServiceUsage"] = 1;
    [Visual Basic]
    Session("MyServiceUsage") = 1
    
  6. Accedere alla variabile di stato memorizzata nell'oggetto Session.

    Nell'esempio seguente viene effettuato l'accesso alla variabile di stato MyServiceUsage per incrementarne il valore.

    Session["MyServiceUsage"] = ((int) Session["MyServiceUsage"]) + 1;
    [Visual Basic]
    Session("MyServiceUsage") = CInt(Session("MyServiceUsage")) + 1
    

Per accedere allo stato specifico di un'applicazione Web che contiene il servizio Web XML e memorizzarlo

  1. Dichiarare un servizio Web XML.

    <%@ WebService Language="C#" Class="ServerUsage" %>
    [Visual Basic]
    <%@ WebService Language="VB" Class="ServerUsage" %>
    
  2. Aggiungere un riferimento allo spazio dei nomi System.Web.Services.

    using System.Web.Services;
    [Visual Basic]
    Imports System.Web.Services
    
  3. Derivare la classe che implementa il servizio Web XML da WebService.

    public class ServerUsage : WebService
    [Visual Basic]
    Public Class ServerUsage : Inherits WebService
    
  4. Dichiarare un metodo di servizio Web XML.

    [ WebMethod ]
    public int PerSessionServiceUsage()
    [Visual Basic]
    < WebMethod > _
    Public Function PerSessionServiceUsage() As Integer
    
  5. Memorizzare lo stato nell'oggetto Application, specificando il nome dello stato per poterlo recuperare in seguito. Nell'esempio seguente il valore 1 viene memorizzato in una variabile di stato denominata appMyServiceUsage.

    Application["appMyServiceUsage"] = 1;
    [Visual Basic]
    Application("appMyServiceUsage") = 1
    
  6. Accedere alla variabile di stato memorizzata nell'oggetto Application.

    Nell'esempio seguente viene effettuato l'accesso alla variabile di stato appMyServiceUsage per incrementarne il valore.

    Application["appMyServiceUsage"] =
       ((int) Application["appMyServiceUsage"]) + 1;
    [Visual Basic]
    Application("appMyServiceUsage") = _
       CInt(Application("appMyServiceUsage")) + 1
    

Nell'esempio di codice che segue viene mostrato un servizio Web XML che espone due metodi: ServerUsage e PerSessionServerUsage. ServerUsage è un contatore degli accessi al metodo ServerUsage del servizio Web XML che prescinde dal client che vi accede. Se, ad esempio, tre client chiamano il metodo ServerUsage del servizio Web XML, il valore restituito all'ultimo sarà 3. PerSessionServiceUsage è invece un contatore relativo a una particolare sessione client. Se tre client accedono a PerSessionServiceUsage consecutivamente, quindi, ognuno di essi riceverà il risultato 1 alla prima chiamata.

<%@ WebService Language="C#" Class="ServerUsage" %>
using System.Web.Services;

public class ServerUsage : WebService {
   [ WebMethod(Description="Number of times this service has been accessed.") ]
   public int ServiceUsage() {
     // If the XML Web service method hasn't been accessed,
     // initialize it to 1.
     if (Application["appMyServiceUsage"] == null) 
     {
       Application["appMyServiceUsage"] = 1;
     }
     else
     {
     // Increment the usage count.
       Application["appMyServiceUsage"] = ((int) Application["appMyServiceUsage"]) + 1;
     }
     return  (int) Application["appMyServiceUsage"];
   }

   [ WebMethod(Description="Number of times a particualr client session has accessed this XML Web service method.",EnableSession=true) ]
   public int PerSessionServiceUsage() {
     // If the XML Web service method hasn't been accessed, initialize
     // it to 1.
     if (Session["MyServiceUsage"] == null) 
     {
       Session["MyServiceUsage"] = 1;
     }
     else
     {
     // Increment the usage count.
       Session["MyServiceUsage"] = ((int) Session["MyServiceUsage"]) + 1;
     }
     return  (int) Session["MyServiceUsage"];
   }
}
[Visual Basic]
<%@ WebService Language="VB" Class="ServerUsage" %>
Imports System.Web.Services

Public Class ServerUsage
    Inherits WebService
    
<WebMethod(Description := "Number of times this service has been accessed.")> _
    Public Function ServiceUsage() As Integer
        ' If the XML Web service method hasn't been accessed, initialize
        ' it to 1.
        If Application("appMyServiceUsage") Is Nothing Then            Application("appMyServiceUsage") = 1
        Else
            ' Increment the usage count.
            Application("appMyServiceUsage") = _               CInt(Application("appMyServiceUsage")) + 1
        End If
        Return CInt(Application("appMyServiceUsage"))
    End Function    
    
<WebMethod(Description := "Number of times a particular client session has accessed this XML Web service method.", EnableSession := True)> _
    Public Function  PerSessionServiceUsage() As Integer
       ' If the XML Web service method hasn't been accessed,
       ' initialize it to 1.
        If Session("MyServiceUsage") Is Nothing Then            Session("MyServiceUsage") = 1
        Else
            ' Increment the usage count.
           Session("MyServiceUsage") = CInt(Session("MyServiceUsage")) + 1
        End If
        Return CInt(Session("MyServiceUsage"))
    End Function
    
End Class

Vedere anche

Gestione dello stato di ASP.NET | Generazione di servizi Web XML mediante ASP.NET