Managing State in XML Web Services Created Using ASP.NET
XML Web services have access to the same state management options as other ASP.NET applications when the class implementing the XML Web service derives from the WebService class. The WebService class contains many of the common ASP.NET objects, including the Session and Application objects.
The Application object provides a mechanism for storing data that is accessible to all code running within the Web application, whereas the Session object allows data to be stored on a per-client session basis. If the client supports cookies, a cookie can identify the client session. Data stored in the Session object is available only when the EnableSession property of the WebMethod attribute is set to true for a class deriving from WebService. A class deriving from WebService automatically has access to the Application object.
To access and store state specific to a particular client session
Declare an XML Web service.
<%@ WebService Language="C#" Class="ServerUsage" %> [Visual Basic]<%@ WebService Language="VB" Class="ServerUsage" %>
Add a reference to the System.Web.Services namespace.
using System.Web.Services; [Visual Basic]Imports System.Web.Services
Derive the class implementing the XML Web service from WebService.
public class ServerUsage : WebService [Visual Basic]Public Class ServerUsage : Inherits WebService
Declare an XML Web service method, setting the EnableSession property of the WebMethod attribute to true.
[ WebMethod(EnableSession=true) ] public int PerSessionServiceUsage() [Visual Basic]< WebMethod(EnableSession:=True) > _ Public Function PerSessionServiceUsage() As Integer
Store state in the Session, specifying a name for the state for later retrieval. In the following example the value
1
is stored in a state variable namedMyServiceUsage
.Session["MyServiceUsage"] = 1; [Visual Basic]Session("MyServiceUsage") = 1
Access the state variable stored in the Session.
In the following example, the
MyServiceUsage
state variable is accessed to increment its value.Session["MyServiceUsage"] = ((int) Session["MyServiceUsage"]) + 1; [Visual Basic]Session("MyServiceUsage") = CInt(Session("MyServiceUsage")) + 1
To access and store state specific to the Web application hosting the XML Web service
Declare an XML Web service.
<%@ WebService Language="C#" Class="ServerUsage" %> [Visual Basic]<%@ WebService Language="VB" Class="ServerUsage" %>
Add a reference to the System.Web.Services namespace.
using System.Web.Services; [Visual Basic]Imports System.Web.Services
Derive the class implementing the XML Web service from WebService.
public class ServerUsage : WebService [Visual Basic]Public Class ServerUsage : Inherits WebService
Declare an XML Web service method.
[ WebMethod ] public int PerSessionServiceUsage() [Visual Basic]< WebMethod > _ Public Function PerSessionServiceUsage() As Integer
Store state in the Application, specifying a name for the state for later retrieval. In the following example the value
1
is stored in a state variable namedappMyServiceUsage
.Application["appMyServiceUsage"] = 1; [Visual Basic]Application("appMyServiceUsage") = 1
Access the state variable stored in the Application.
In the following example, the
appMyServiceUsage
state variable is accessed to increment its value.Application["appMyServiceUsage"] = ((int) Application["appMyServiceUsage"]) + 1; [Visual Basic]Application("appMyServiceUsage") = _ CInt(Application("appMyServiceUsage")) + 1
The following code example is an XML Web service with two XML Web service methods: ServerUsage
and PerSessionServerUage
. ServerUsage
is a hit counter for every time the ServerUsage
XML Web service method is accessed, regardless of the client communicating with the XML Web service method. For instance, if three clients call the ServerUsage
XML Web service method consecutively, the last one receives a return value of 3. PerSessionServiceUsage
, however, is a hit counter for a particular client session. If three clients access PerSessionServiceUsage
consecutively, each will receive the same result of 1 on the first call.
<%@ 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
See Also
ASP.NET State Management | Building XML Web Services Using ASP.NET