📜  ASP.NET-管理状态

📅  最后修改于: 2020-11-21 05:45:15             🧑  作者: Mango


超文本传输协议(HTTP)是无状态协议。当客户端与服务器断开连接时,ASP.NET引擎将丢弃页面对象。这样,每个Web应用程序都可以扩展以同时服务多个请求,而不会耗尽服务器内存。

但是,需要某种技术来存储请求之间的信息,并在需要时进行检索。该信息,即当前会话中当前用户的所有控件和变量的当前值,称为状态。

ASP.NET管理四种类型的状态:

  • 查看状态
  • 控制状态
  • 会话状态
  • 申请状态

查看状态

视图状态是页面及其所有控件的状态。它是由ASP.NET框架自动维护的。

将页面发送回客户端时,将确定页面及其控件的属性中的更改,并将其存储在名为_VIEWSTATE的隐藏输入字段的值中。当页面再次发回时,_VIEWSTATE字段随HTTP请求发送到服务器。

可以针对以下情况启用或禁用视图状态:

  • 通过在web.config文件的部分中设置EnableViewState属性来整个应用程序

  • 通过设置Page指令将EnableViewState属性,作为页面<%@页面语言= “C#”的EnableViewState = “假” %>

  • 通过设置Control.EnableViewState属性的控件

它使用StateBag类定义的视图状态对象实现,该对象定义了视图状态项的集合。状态包是一个数据结构,其中包含属性值对,并存储为与对象相关联的字符串。

StateBag类具有以下属性:

Properties Description
Item(name) The value of the view state item with the specified name. This is the default property of the StateBag class.
Count The number of items in the view state collection.
Keys Collection of keys for all the items in the collection.
Values Collection of values for all the items in the collection.

StateBag类具有以下方法:

Methods Description
Add(name, value) Adds an item to the view state collection and existing item is updated.
Clear Removes all the items from the collection.
Equals(Object) Determines whether the specified object is equal to the current object.
Finalize Allows it to free resources and perform other cleanup operations.
GetEnumerator Returns an enumerator that iterates over all the key/value pairs of the StateItem objects stored in the StateBag object.
GetType Gets the type of the current instance.
IsItemDirty Checks a StateItem object stored in the StateBag object to evaluate whether it has been modified.
Remove(name) Removes the specified item.
SetDirty Sets the state of the StateBag object as well as the Dirty property of each of the StateItem objects contained by it.
SetItemDirty Sets the Dirty property for the specified StateItem object in the StateBag object.
ToString Returns a string representing the state bag object.

以下示例演示了存储视图状态的概念。让我们保留一个计数器,单击页面上的一个按钮,该计数器将在页面每次回发时递增。标签控件在计数器中显示该值。

标记文件代码如下:


         Untitled Page
      
   
   
   
      

View State demo

Page Counter:

该示例的文件背后的代码如下所示:

public partial class _Default : System.Web.UI.Page
{
   public int counter
   {
      get
      {
         if (ViewState["pcounter"] != null)
         {
            return ((int)ViewState["pcounter"]);
         }
         else
         {
            return 0;
         }
      }
      
      set
      {
         ViewState["pcounter"] = value;
      }
   }
        
   protected void Page_Load(object sender, EventArgs e)
   {
      lblCounter.Text = counter.ToString();
      counter++;
   }
}

它将产生以下结果:

查看状态演示

控制状态

无法修改,直接访问或禁用控件状态。

会话状态

当用户连接到ASP.NET网站时,将创建一个新的会话对象。打开会话状态后,将为每个新请求创建一个新的会话状态对象。该会话状态对象成为上下文的一部分,并且可以通过页面使用。

会话状态通常用于存储应用程序数据,例如库存,供应商列表,客户记录或购物车。它还可以保留有关用户及其偏好的信息,并跟踪未决操作。

使用120位的SessionID识别并跟踪会话,该ID从客户端传递到服务器,然后作为cookie或修改的URL传递回去。 SessionID是全局唯一且随机的。

会话状态对象是从HttpSessionState类创建的,该类定义了会话状态项的集合。

HttpSessionState类具有以下属性:

Properties Description
SessionID The unique session identifier.
Item(name) The value of the session state item with the specified name. This is the default property of the HttpSessionState class.
Count The number of items in the session state collection.
TimeOut Gets and sets the amount of time, in minutes, allowed between requests before the session-state provider terminates the session.

HttpSessionState类具有以下方法:

Methods Description
Add(name, value) Adds an item to the session state collection.
Clear Removes all the items from session state collection.
Remove(name) Removes the specified item from the session state collection.
RemoveAll Removes all keys and values from the session-state collection.
RemoveAt Deletes an item at a specified index from the session-state collection.

会话状态对象是一个名称/值对,用于存储和检索会话状态对象中的某些信息。您可以将以下代码用于同一内容:

void StoreSessionInfo()
{
   String fromuser = TextBox1.Text;
   Session["fromuser"] = fromuser;
}

void RetrieveSessionInfo()
{
   String fromuser = Session["fromuser"];
   Label1.Text = fromuser;
}

上面的代码仅将字符串存储在Session字典对象中,但是,它可以存储所有原始数据类型和由原始数据类型组成的数组,以及DataSet,DataTable,HashTable和Image对象,以及任何用户-从ISerializable对象继承的定义的类。

以下示例演示了存储会话状态的概念。页面上有两个按钮,一个用于输入字符串的文本框和一个用于显示上次会话存储的文本的标签。

标记文件代码如下:


         Untitled Page
      
   
   
   
      
     
Properties Description
Item(name) The value of the application state item with the specified name. This is the default property of the HttpApplicationState class.
Count The number of items in the application state collection.

在设计视图中,它应类似于以下内容:

会话设计视图

文件背后的代码在这里给出:

public partial class _Default : System.Web.UI.Page 
{
   String mystr;
   
   protected void Page_Load(object sender, EventArgs e)
   {
      this.lblshstr.Text = this.mystr;
      this.lblsession.Text = (String)this.Session["str"];
   }
   
   protected void btnstr_Click(object sender, EventArgs e)
   {
      this.mystr = this.txtstr.Text;
      this.Session["str"] = this.txtstr.Text;
      this.lblshstr.Text = this.mystr;
      this.lblsession.Text = (String)this.Session["str"];
   }
}

执行文件并观察其工作方式:

会话运行视图

申请状态

ASP.NET应用程序是Web服务器上单个虚拟目录中所有网页,代码和其他文件的集合。当信息以应用程序状态存储时,所有用户均可使用。

为了提供应用程序状态的使用,ASP.NET通过HTTPApplicationState类为每个应用程序创建一个应用程序状态对象,并将该对象存储在服务器内存中。该对象由类文件global.asax表示。

应用程序状态主要用于存储命中计数器和其他统计数据,全球应用程序数据(如税率,折扣率等),并跟踪用户访问该网站的情况。

HttpApplicationState类具有以下属性:

Methods Description
Add(name, value) Adds an item to the application state collection.
Clear Removes all the items from the application state collection.
Remove(name) Removes the specified item from the application state collection.
RemoveAll Removes all objects from an HttpApplicationState collection.
RemoveAt Removes an HttpApplicationState object from a collection by index.
Lock() Locks the application state collection so only the current user can access it.
Unlock() Unlocks the application state collection so all the users can access it.

HttpApplicationState类具有以下方法:

方法 描述
添加(名称,值) 将一项添加到应用程序状态集合。
明确 从应用程序状态集合中删除所有项目。
删除(名称) 从应用程序状态集合中删除指定的项目。
移除所有 从HttpApplicationState集合中删除所有对象。
RemoveAt 从索引中删除一个HttpApplicationState对象。
锁() 锁定应用程序状态集合,以便只有当前用户才能访问它。
开锁() 解锁应用程序状态集合,以便所有用户都可以访问它。

通常通过编写事件处理程序来维护应用程序状态数据:

  • Application_Start
  • Application_End
  • 应用程序错误
  • 会话开始
  • 会话结束

以下代码片段显示了存储应用程序状态信息的基本语法:

Void Application_Start(object sender, EventArgs e)
{
   Application["startMessage"] = "The application has started.";
}

Void Application_End(object sender, EventArgs e)
{
   Application["endtMessage"] = "The application has ended.";
}