Este artigo passo a passo descreve como utilizar a classe
System.Net.CookieContainer quando utilizar sessões ou cookies para um serviço Web num aplicativo.
Apesar dos serviços Web serem inerentemente sem estado, pode utilizar objectos de sessão para manter a comunicação com estado entre uma aplicação cliente e uma aplicação de servidor. Para activar a comunicação com estado entre um cliente da Web e o serviço Web, pode utilizar o objecto
CookieContainer com cada mensagem é enviada para o serviço da Web da aplicação do cliente. Podem consumir um serviço Web com estado numa aplicação cliente com o estado activado.
Criar uma aplicação de serviço Web
- Execute o Microsoft Visual Studio .NET. Criar uma Web do ASP.NET novo projecto de serviço utilizando o Visual C#. NET.
Por predefinição, é criado Service1.asmx. - Nome do projecto WebService1 .
- No menu criar , clique em criar soluções .
Activar suporte de sessão no servidor
Por predefinição, o suporte de sessão do ASP.NET para cada método do serviço Web está desactivado. Terá de activar explicitamente o suporte de sessão para cada método de serviço Web que requer um estado de sessão. Para activar o suporte de sessão, adicione a propriedade
EnableSession o atributo '
WebMethod . Para o fazer, siga estes passos:
- No Solution Explorer, clique com o botão direito do rato Service1.asmx e, em seguida, substitua o código existente com o seguinte código:
using System;
using System.ComponentModel;
using System.Web;
using System.Web.Services;
namespace WebService1
{
/// <summary>
/// Summary description for Service1.
/// </summary>
public class Service1 : System.Web.Services.WebService
{
public Service1()
{
//CODEGEN: Call required by ASP.NET Web Services Designer.
InitializeComponent();
}
#region Component Designer generated code
private void InitializeComponent()
{
}
#endregion
[WebMethod(EnableSession=true)]
public string SetTime(string CurrentTime)
{
Session.Add("Time", CurrentTime);
return ((string) Session["Time"] );
}
[WebMethod(EnableSession=true)]
public string GetTime()
{
return ((string) Session["Time"] );
}
}
}
poderá notar que o atributo [WebMethod(EnableSession=true)] é adicionado para ambos os métodos Web activar o suporte de sessão. - No menu criar , clique em criar soluções .
Criar uma aplicação de cliente do ASP.NET
Quando o método de serviço Web utiliza um estado de sessão, um cookie é passado ao cliente do serviço Web nos cabeçalhos de resposta. Esse cookie identifica a sessão para esse cliente de serviço Web. Para receber esse cookie para o cliente de serviço Web, uma nova instância do
CookieContainer tem de ser criada e, em seguida, atribuída à propriedade
CookieContainer antes do método de serviço Web é chamado. Deste modo, garante que o cookie está correctamente incluído nos pedidos subsequentes. Terá de o fazer uma vez que tem de armazenar os cookies que são recebidos no estado de sessão para obtenção futuro por esta sessão. Para o fazer, siga estes passos:
- Criar uma nova aplicação Web do ASP.NET utilizando o Visual C# .NET. Nome do projecto CookieContainerApp .
Por predefinição, é criado WebForm1.aspx. - Na vista de estrutura , clique com o botão direito do rato WebForm1 e clique em Vista de código HTML .
- Replace the existing code with the following code:
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="CookieContainerApp.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 270px; POSITION: absolute; TOP: 143px" runat="server" Text="SetTimeInSession" Width="187px"></asp:Button>
<asp:Button id="Button2" style="Z-INDEX: 102; LEFT: 269px; POSITION: absolute; TOP: 203px" runat="server" Text="GetTimeFromSession"></asp:Button>
<asp:Label id="Label1" style="Z-INDEX: 103; LEFT: 565px; POSITION: absolute; TOP: 150px" runat="server"></asp:Label>
<asp:Label id="Label2" style="Z-INDEX: 104; LEFT: 565px; POSITION: absolute; TOP: 211px" runat="server"></asp:Label>
</form>
</body>
</HTML>
- No Solution Explorer, clique com o botão direito do rato em References e, em seguida, clique em Adicionar referência Web .
- Na caixa de texto endereço , escreva o seguinte URL para WebService1:
http://localhost/WebService1/Service1.asmx
- Clique em Ir e clique em Adicionar referência .
- No Solution Explorer, clique com o botão direito do rato em WebForm1.aspx e clique em Código .
- Substitua o código existente no WebForm1 com o seguinte código:
using System;
using System.Web.UI.WebControls;
namespace CookieContainerApp
{
/// <summary>
/// Summary description for WebForm1.
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.Button Button2;
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.Label Label2;
// Create a new instance of a proxy class for your Web service.
private localhost.Service1 objWSFunc = new localhost.Service1();
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here.
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: Call required by ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support. Do not modify.
/// The contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Button2.Click += new System.EventHandler(this.Button2_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void Button1_Click(object sender, System.EventArgs e)
{
System.Net.CookieContainer cookieJar = new System.Net.CookieContainer();
// Assign the CookieContainer to the proxy class.
objWSFunc.CookieContainer = cookieJar;
// Get CurrentTime.
DateTime dt = DateTime.Now;
string CurrentTime = dt.ToString("s");
// Invoke a Web service method that uses session state and therefore cookies.
objWSFunc.SetTime(CurrentTime);
// Store the cookies received in the session state for future retrieval by this session.
Session.Add("Time", cookieJar);
Label1.Text="Time set in Session : " +CurrentTime ;
Label2.Visible=false;
}
private void Button2_Click(object sender, System.EventArgs e)
{
// Get the SessionObject.
objWSFunc.CookieContainer = (System.Net.CookieContainer) Session["Time"];
Label2.Visible=true;
// Call the WebService method to access the session state.
Label2.Text = "Time Get from Session : "+ objWSFunc.GetTime();
}
}
}
- No menu criar , clique em criar soluções .
Adicionar conteúdo a um objecto de sessão utilizando CookieContainer
- No menu Debug , clique em Iniciar para criar e executar a aplicação.
- Clique em SetTimeInSession .
O valor de tempo actual é armazenado no objecto de sessão e a hora actual é apresentado.
No botão faça clique sobre eventos, o objecto CookieContainer é criado e, em seguida, é atribuído o proxy de serviço Web CookieContainer propriedade. Em seguida, o método de serviço Web SetTime() é chamado para actualizar o objecto sessão.
Obter conteúdo a partir do objeto Session utilizando CookieContainer
Clique em
GetTimeFromSession . Poderá notar que a hora valor armazenado na sessão objecto aparece quando chamada Web serviço método
GetTime() .
Para obter mais informações sobre a classe CookieContainer e sobre como utilizar o estado de sessão do ASP.NET num serviço Web, visite os seguintes Web sites da Microsoft:
http://msdn2.microsoft.com/en-us/library/system.net.cookiecontainer(vs.71).aspx
(http://msdn2.microsoft.com/en-us/library/system.net.cookiecontainer(vs.71).aspx)
http://msdn2.microsoft.com/en-us/library/aa480509.aspx
(http://msdn2.microsoft.com/en-us/library/aa480509.aspx)