Este artigo passo a passo descreve como usar a classe
System.Net.CookieContainer quando você usa sessões ou cookies para um serviço da Web em um aplicativo.
Embora os serviços da Web sejam sem monitoração de estado por natureza, você pode usar objetos de sessão para manter a comunicação com monitoração de estado entre um aplicativo cliente e um aplicativo de servidor. Para habilitar a comunicação com monitoração de estado entre um cliente da Web e o serviço da Web, você pode usar o objeto
CookieContainer com cada mensagem é enviada para o serviço da Web do aplicativo cliente. Você pode consumir um serviço da Web com monitoração de estado em um aplicativo cliente estado habilitado.
Criar um aplicativo de serviço da Web
- Execute o Microsoft Visual Studio .NET. Criar uma nova Web ASP.NET projeto de serviço usando o Visual translation from VPE for Csharp. NET.
Por padrão, Service1.asmx é criado. - Nomeie o projeto WebService1 .
- No menu Build , clique em Build Solution .
Ativar suporte de sessão no servidor
Por padrão, o suporte de sessão ASP.NET para cada método Web service está desativado. É necessário ativar explicitamente o suporte de sessão para cada método Web service que requer um estado de sessão. Para habilitar o suporte de sessão, adicione a propriedade
EnableSession para o atributo
WebMethod . Para fazer isso, execute as seguintes etapas:
- No Solution Explorer, clique com o botão direito do mouse em Service1.asmx e, em seguida, substitua o código existente com o código a seguir:
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"] );
}
}
}
você notará que o atributo [WebMethod(EnableSession=true)] é adicionado para ambos os métodos da Web habilitar o suporte a sessão. - No menu Build , clique em Build Solution .
Criar um aplicativo cliente do ASP.NET
Quando o método de serviço da Web usa um estado de sessão, um cookie é passado volta para o cliente de serviço da Web nos cabeçalhos de resposta. Esse cookie identifica exclusivamente a sessão para esse cliente de serviço da Web. Para receber esse cookie para o cliente de serviço da Web, uma nova instância do
CookieContainer deve ser criada e atribuída, em seguida, a propriedade
CookieContainer antes que o método de serviço da Web é chamado. Isso certifica-se de que o cookie corretamente está incluído em solicitações subseqüentes. Você deve fazer isso porque você deve armazenar os cookies que são recebidos no estado de sessão para recuperação futura por esta sessão. Para fazer isso, execute as seguintes etapas:
- Criar um novo aplicativo ASP.NET usando Visual translation from VPE for Csharp .NET. Nomeie o projeto CookieContainerApp .
Por padrão, WebForm1.aspx é criado. - No modo de Design , clique com o botão direito do mouse WebForm1 e, em seguida, clique em Exibir código fonte 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 mouse em References e clique em Add Web Reference .
- Na caixa de texto endereço , digite a seguinte URL para WebService1:
http://localhost/WebService1/Service1.asmx
- Clique em Ir e Adicionar referência .
- No Solution Explorer, clique com o botão direito do mouse em WebForm1.aspx e, em seguida, clique em View Code .
- 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 Build , clique em Build Solution .
Adicionar conteúdo a um objeto de sessão, usando CookieContainer
- No menu Debug , clique em Iniciar para criar e executar o aplicativo.
- Clique em SetTimeInSession .
O valor de tempo atual é armazenado no objeto de sessão e a hora atual é exibida.
No botão, clique em eventos, o objeto CookieContainer é criado e, em seguida, é atribuído ao proxy de serviço da Web CookieContainer propriedade. Em seguida, o método de serviço da Web SetTime() é chamado para atualizar o objeto da sessão.
Obter conteúdo do objeto de sessão usando CookieContainer
Clique em
GetTimeFromSession . Você pode perceber que o tempo de valor que é armazenado na sessão objeto aparece quando você chamar a Web service método
GetTime() .
Para obter mais informações sobre a classe CookieContainer e sobre como usar estado da sessão ASP.NET em um serviço da Web, visite os seguintes sites:
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)