⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stateoverview.aspx

📁 书籍教程 >> .Net教程 >> asp.net编程精彩百例
💻 ASPX
📖 第 1 页 / 共 2 页
字号:
<%@ Register TagPrefix="Acme" Namespace="Acme" Assembly="QSTools" %>
<%@ Register TagPrefix="Acme" TagName="SourceRef" Src="/quickstart/aspplus/util/SrcRef.ascx"%>

<!-- #include virtual="/quickstart/aspplus/include/header.inc" -->

<h4>管理应用程序状态</h4>


<div class="indent" style="font-family:Verdana; font-size:8pt;">
    <b> <img align="middle" src="/quickstart/images/bullet.gif">&nbsp;&nbsp;</b>
    <a class="toc2" href="#applicationstate">使用应用程序状态</a><br>
    <b> <img align="middle" src="/quickstart/images/bullet.gif">&nbsp;&nbsp;</b>
    <a class="toc2" href="#sessionstate">使用会话状态</a><br>
    <b> <img align="middle" src="/quickstart/images/bullet.gif">&nbsp;&nbsp;</b>
    <a class="toc2" href="#cookies">使用客户端 Cookie</a><br>
    <b> <img align="middle" src="/quickstart/images/bullet.gif">&nbsp;&nbsp;</b>
    <a class="toc2" href="#viewstate">使用视图状态</a><br>
    <b> <img align="middle" src="/quickstart/images/bullet.gif">&nbsp;&nbsp;</b>
    <a class="toc2" href="#summary">本节小结</a><br>
</div>

<p>
<hr>

<!--BEGIN SECTION--> <a name="applicationstate"><span class="subhead">使用应用程序状态</span>
<p>
本示例阐释如何使用应用程序状态读取 <b>Application_Start</b> 中的数据集。
<p>
<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/apps/application2/CS/application2.aspx"
  ViewSource="/quickstart/aspplus/samples/apps/application2/application2.src"
  Icon="/quickstart/aspplus/images/application2.gif"
  Caption="C# Application2.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/apps/application2/VB/application2.aspx"
  ViewSource="/quickstart/aspplus/samples/apps/application2/application2.src"
  Icon="/quickstart/aspplus/images/application2.gif"
  Caption="VB Application2.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/apps/application2/JS/application2.aspx"
  ViewSource="/quickstart/aspplus/samples/apps/application2/application2.src"
  Icon="/quickstart/aspplus/images/application2.gif"
  Caption="JScript Application2.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>
<p>

因为应用程序和它存储的所有对象可以同时由不同的线程访问,所以最好只将很少修改的数据与应用程序范围一起存储。理想情况是,对象在 <b>Application_Start</b> 事件中初始化,对它的进一步访问是只读的。
<p>

在下面的示例中,文件在 <b>Application_Start</b>(在 Global.asax 文件中定义)中读取,内容则以应用程序状态存储在 <b>DataView</b> 对象中。

<p><Acme:TabControl runat="server">
<Tab Name="C#">
void Application_Start() {
    DataSet ds = new DataSet();

    FileStream fs = new FileStream(Server.MapPath("schemadata.xml"),FileMode.Open,FileAccess.Read);
    StreamReader reader = new StreamReader(fs);
    ds.ReadXml(reader);
    fs.Close();

    DataView view = new DataView(ds.Tables[0]);
    Application["Source"] = view;
}
</Tab>

<Tab Name="VB">
Sub Application_Start()
    Dim ds As New DataSet()

    Dim fs As New FileStream(Server.MapPath("schemadata.xml"),FileMode.Open,FileAccess.Read)
    Dim reader As New StreamReader(fs)
    ds.ReadXml(reader)
    fs.Close()

    Dim view As New DataView (ds.Tables(0))
    Application("Source") = view
End Sub
</Tab>

<Tab Name="JScript">
function Application_Start() : void {
    var ds:DataSet = new DataSet();

    var fs:FileStream = new FileStream(Server.MapPath("schemadata.xml"),FileMode.Open,FileAccess.Read);
    var reader:StreamReader = new StreamReader(fs);
    ds.ReadXml(reader);
    fs.Close();

    var view:DataView = new DataView(ds.Tables[0]);
    Application("Source") = view;
}
</Tab>

</Acme:TabControl><p>

<p>

在 <b>Page_Load</b> 方法中,<b>DataView</b> 随后被检索并用于填充 <b>DataGrid</b> 对象:
<p><Acme:TabControl runat="server">
<Tab Name="C#">
void Page_Load(Object sender, EventArgs e) {
    DataView Source = (DataView)(Application["Source"]);
    ...
    MyDataGrid.DataSource = Source;
    ...
}
</Tab>

<Tab Name="VB">
Sub Page_Load(sender As Object, e As EventArgs)
    Dim Source As New DataView  = CType(Application("Source"), DataView)
    ...
    MyDataGrid.DataSource = Source
    ...
End Sub
</Tab>

<Tab Name="JScript">
function Page_Load(sender:Object, e:EventArgs) : void {
    var Source:DataView = DataView((Application("Source")));
    ...
    MyDataGrid.DataSource = Source;
    ...
}
</Tab>

</Acme:TabControl><p>

<p>

此解决方案的优点是只有第一个请求付出检索数据的代价。所有后面的请求则使用已有的 <b>DataView</b> 对象。由于数据自初始化后从不修改,所以不必为序列化访问做任何规定。
<p>



<!--BEGIN SECTION--> <a name="sessionstate"><span class="subhead">使用会话状态</span>
<p>

下例说明如何使用会话状态存储易失的用户首选项。
<p>

<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/apps/session1/CS/session1.aspx"
  ViewSource="/quickstart/aspplus/samples/apps/session1/session1.src"
  Icon="/quickstart/aspplus/images/session1.gif"
  Caption="C# Session1.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/apps/session1/VB/session1.aspx"
  ViewSource="/quickstart/aspplus/samples/apps/session1/session1.src"
  Icon="/quickstart/aspplus/images/session1.gif"
  Caption="VB Session1.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/apps/session1/JS/session1.aspx"
  ViewSource="/quickstart/aspplus/samples/apps/session1/session1.src"
  Icon="/quickstart/aspplus/images/session1.gif"
  Caption="JScript Session1.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>

<p>

为了在会话期间为用户提供单独的数据,数据可与会话范围一起存储。在下面的示例中,在 Global.asax 文件中的 <b>Session_Start</b> 事件中初始化用户首选项的值。 
<p>


<p><Acme:TabControl runat="server">
<Tab Name="C#">
void Session_Start() {
    Session["BackColor"] = "beige";
    ...
}
</Tab>

<Tab Name="VB">
Sub Session_Start()
    Session("BackColor") = "beige"
    ...
End Sub
</Tab>

<Tab Name="JScript">
function Session_Start() : void {
    Session("BackColor") = "beige";
    ...
}
</Tab>

</Acme:TabControl><p>

在下面的自定义页中,根据用户输入在 <b>Submit_Click</b> 事件处理程序中修改用户首选项的值。

<p><Acme:TabControl runat="server">
<Tab Name="C#">
protected void Submit_Click(Object sender, EventArgs e) {
    Session["BackColor"] = BackColor.Value;
    ...

    Response.Redirect(State["Referer"].ToString());
}
</Tab>

<Tab Name="VB">
Protected Sub Submit_Click(sender As Object, e As EventArgs)
    Session("BackColor") = BackColor.Value
    ...

    Response.Redirect(State("Referer").ToString())
End Sub
</Tab>

<Tab Name="JScript">
protected function Submit_Click(sender:Object, e:EventArgs) : void {
    Session("BackColor") = BackColor.Value;
    ...

    Response.Redirect(State("Referer").ToString());
}
</Tab>

</Acme:TabControl><p>

<p>

使用 <b>GetStyle</b> 方法检索个别值:
<p><Acme:TabControl runat="server">
<Tab Name="C#">
protected String GetStyle(String key) {
    return Session[key].ToString();
}
</Tab>

<Tab Name="VB">
Protected GetStyle(key As String) As String
    Return(Session(key).ToString())
End Sub
</Tab>

<Tab Name="JScript">
protected function GetStyle(key:String) : String {
    return Session(key).ToString();
}
</Tab>

</Acme:TabControl><p>

<b>GetStyle 方法</b>用于构造会话特定样式:
<div class="code"><pre>
&lt;style&gt;
    body
    {
      font: &lt;%=GetStyle("FontSize")%&gt; &lt;%=GetStyle("FontName")%&gt;;
      background-color: &lt;%=GetStyle("BackColor")%&gt;;
    }
    a
    {
        color: &lt;%=GetStyle("LinkColor")%&gt;
    }
&lt;/style&gt;
</pre></div>
<p>

若要验证值是否真的与会话范围一起存储了,请将示例页打开两次,然后在第一个浏览器窗口中更改一个值并刷新第二个浏览器窗口。因为两个浏览器实例共享一个公共 <b>Session</b> 对象,所以第二个窗口获得此更改。
<p>

<b>配置会话状态:</b>可以通过 web.config 文件中的 <b>&lt;sessionState&gt;</b> 节配置会话状态功能。若要使默认的超时时间(20 分钟)延长一倍,可以将下列内容添加到应用程序的 web.config 文件:
<div class="code"><xmp>
<sessionState
  timeout="40"
/>
</xmp></div>

<p>
默认情况下,ASP.NET 像 ASP 一样,在处理请求的同一进程中存储会话状态。如果 Cookie 不可用,可以通过将会话标识符添加到 URL 来跟踪会话。若要启用此功能,请设置以下内容:
<div class="code"><xmp>
<sessionState
  cookieless="true"
/>
</xmp></div>

<p>
默认情况下,ASP.NET 像 ASP 一样,在处理请求的同一进程中存储会话状态。另外,ASP.NET 可以在外部进程中存储会话数据,而外部进程甚至可以驻留在另一台计算机上。若要启用此功能:
<ul>
<li>使用服务管理单元或者通过在命令行上执行“net start aspnet_state”来启动 ASP.NET 状态服务。默认情况下,状态服务在端口 42424 上侦听。若要更改此端口,请修改服务的注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSte\Services\aspnet_state\Parameters\Port
<li>将 <b>&lt;sessionState&gt;</b> 节的 <b>mode</b> 属性设置为“StateServer”。
<li>用启动 aspnet_state 的计算机的值配置 <b>stateConnectionString</b> 属性。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -