Artigo: 816637 - Última revisão: quarta-feira, 16 de Maio de 2007 - Revisão: 2.4

COMO: Utilizar CookieContainer para manter um estado nos serviços Web quando utilizar o Visual C# .NET

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

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

  1. 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.
  2. Nome do projecto WebService1 .
  3. 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:
  1. 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.
  2. 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:
  1. Criar uma nova aplicação Web do ASP.NET utilizando o Visual C# .NET. Nome do projecto CookieContainerApp .

    Por predefinição, é criado WebForm1.aspx.
  2. Na vista de estrutura , clique com o botão direito do rato WebForm1 e clique em Vista de código HTML .
  3. 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>
    
  4. No Solution Explorer, clique com o botão direito do rato em References e, em seguida, clique em Adicionar referência Web .
  5. Na caixa de texto endereço , escreva o seguinte URL para WebService1:

    http://localhost/WebService1/Service1.asmx
  6. Clique em Ir e clique em Adicionar referência .
  7. No Solution Explorer, clique com o botão direito do rato em WebForm1.aspx e clique em Código .
  8. 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();
            
          }
           }
    }
    
  9. No menu criar , clique em criar soluções .


Adicionar conteúdo a um objecto de sessão utilizando CookieContainer

  1. No menu Debug , clique em Iniciar para criar e executar a aplicação.
  2. 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() .


Referências

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)



A informação contida neste artigo aplica-se a:
  • Microsoft Web Services (included with the .NET Framework) 1.0
  • Microsoft Web Services Enhancements for Microsoft .NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Palavras-chave: 
kbmt kbstate kbcookie kbwebservices kbwebserver kbwebforms kbhowtomaster KB816637 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 816637  (http://support.microsoft.com/kb/816637/en-us/ )