Compartir a través de


Administrar el estado en servicios Web XML creados mediante ASP.NET

Los servicios Web XML tienen acceso a las mismas opciones de administración de estados que otras aplicaciones ASP.NET cuando la clase que implementa el servicio Web XML se deriva de la clase WebService. La clase WebService contiene muchos de los objetos comunes de ASP.NET, incluidos los objetos Session y Application.

El objeto Application proporciona un mecanismo para almacenar datos a los que puede tener acceso todo el código que se ejecuta en la aplicación Web, mientras que el objeto Session permite el almacenamiento de datos por cada sesión de cliente. Si el cliente admite cookies, la sesión del cliente se puede identificar mediante una cookie. Los datos almacenados en el objeto Session sólo están disponibles cuando el valor de la propiedad EnableSession del atributo WebMethod se establece a true para una clase que se deriva de WebService. Una clase que se deriva de WebService tiene acceso de forma automática al objeto Application.

Para tener acceso al estado y almacenarlo de forma específica para una sesión de cliente determinada

  1. Declare un servicio Web XML.

    <%@ WebService Language="C#" Class="ServerUsage" %>
    [Visual Basic]
    <%@ WebService Language="VB" Class="ServerUsage" %>
    
  2. Agregue una referencia al espacio de nombres System.Web.Services.

    using System.Web.Services;
    [Visual Basic]
    Imports System.Web.Services
    
  3. Derive de WebService la clase que implementa el servicio Web XML.

    public class ServerUsage : WebService 
    [Visual Basic]
    Public Class ServerUsage : Inherits WebService
    
  4. Declare un método de servicio Web XML en el que se establezca a true el valor de la propiedad EnableSession del atributo WebMethod.

    [ WebMethod(EnableSession=true) ]
    public int PerSessionServiceUsage()
    [Visual Basic]
    < WebMethod(EnableSession:=True) > _
    Public Function PerSessionServiceUsage() As Integer
    
  5. Almacene el estado en Session y especifique un nombre para el estado con el fin de recuperarlo posteriormente. En el ejemplo siguiente, el valor 1 se almacena en una variable de estado denominada MyServiceUsage.

    Session["MyServiceUsage"] = 1;
    [Visual Basic]
    Session("MyServiceUsage") = 1
    
  6. Obtenga acceso a la variable de estado almacenada en Session.

    En el ejemplo siguiente se obtiene acceso a la variable de estado MyServiceUsage para incrementar su valor.

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

Para tener acceso al estado y almacenarlo de forma específica para la aplicación Web que aloja el servicio Web XML

  1. Declare un servicio Web XML.

    <%@ WebService Language="C#" Class="ServerUsage" %>
    [Visual Basic]
    <%@ WebService Language="VB" Class="ServerUsage" %>
    
  2. Agregue una referencia al espacio de nombres System.Web.Services.

    using System.Web.Services;
    [Visual Basic]
    Imports System.Web.Services
    
  3. Derive de WebService la clase que implementa el servicio Web XML.

    public class ServerUsage : WebService
    [Visual Basic]
    Public Class ServerUsage : Inherits WebService
    
  4. Declare un método de servicio Web XML.

    [ WebMethod ]
    public int PerSessionServiceUsage()
    [Visual Basic]
    < WebMethod > _
    Public Function PerSessionServiceUsage() As Integer
    
  5. Almacene el estado en Application y especifique un nombre para el estado con el fin de recuperarlo posteriormente. En el ejemplo siguiente, el valor 1 se almacena en una variable de estado denominada appMyServiceUsage.

    Application["appMyServiceUsage"] = 1;
    [Visual Basic]
    Application("appMyServiceUsage") = 1
    
  6. Obtenga acceso a la variable de estado almacenada en Application.

    En el ejemplo siguiente se obtiene acceso a la variable de estado appMyServiceUsage para incrementar su valor.

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

El siguiente ejemplo de código contiene un servicio Web XML con dos métodos: ServerUsage y PerSessionServerUage. ServerUsage es un contador de visitas que registra todas las veces que se tiene acceso al método de servicio Web XML ServerUsage, con independencia del cliente que se comunica con ese método. Por ejemplo, si tres clientes llaman consecutivamente al método de servicio Web XML ServerUsage, el último recibirá el valor 3. Sin embargo, PerSessionServiceUsage es un contador de visitas para una sesión de cliente determinada. Si tres clientes tienen acceso consecutivamente al método PerSessionServiceUsage, cada uno recibirá el mismo resultado en la primera llamada, 1.

<%@ 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

Vea también

Administración de estados de ASP.NET | Generar servicios Web XML mediante ASP.NET