検索
ホームページバックエンド開発C#.Net チュートリアルASP.NETセッションの使用方法の詳細な説明

セッションモデルの紹介

セッションとは何ですか?簡単に言えば、サーバーからクライアントに与えられる番号です。 WWW サーバーが実行されている場合、複数のユーザーがこのサーバー上で実行されている Web サイトを閲覧する可能性があります。各ユーザーが初めてこの WWW サーバーへの接続を確立すると、このサーバーとのセッションが確立され、サーバーはユーザーの一意の ID を識別するための SessionID を自動的に割り当てます。この SessionID は、WWW サーバーによってランダムに生成される 24 文字の文字列です。次の実験で実際にどのようになるかを見てみましょう。

この一意の SessionID には、実用上非常に重要な意味があります。ユーザーがフォームを送信すると、ブラウザーはユーザーの SessionID を HTTP ヘッダー情報に自動的に追加します (これはブラウザーの自動機能であり、ユーザーはそれに気づきません)。サーバーがフォームの処理を完了すると、結果をSessionIDに対応するユーザーに送信します。想像してみてください。SessionID がない場合、2 人のユーザーが同時に登録するとき、サーバーはどのユーザーがどのフォームを送信したかをどのようにして知ることができるでしょうか?もちろん、SessionID には他にも多くの機能がありますが、これについては後で説明します。

SessionID に加えて、各セッションには他の多くの情報も含まれています。しかし、ASP または ASP.NET プログラムを作成する人にとって、最も便利なのは、ASP/ASP.NET の組み込み Session オブジェクトにアクセスして、ユーザーごとに独自の情報を保存することです。たとえば、Web サイトにアクセスしたユーザーが閲覧したページの数を知りたい場合は、ユーザーがアクセスする各ページに

<%
If Session("PageViewed") = ""Then
 Session("PageViewed") = 1
Else
 Session("PageViewed") = Session("PageViewed") + 1
End If
%>

を追加します。

<%
Response.Write("You have viewed " & Session("PageViewed") & " pages")
%>

次の文は、ユーザーにページ数を知らせることができます。彼は閲覧しました:

<sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20" 
/>

読者の中には、配列のように見えるこのセッション (「..」) はどこから来たのかと疑問に思う人もいるかもしれません。それを定義する必要がありますか?実際、この Session オブジェクトは、ASP 解釈機能を備えた WWW サーバーの組み込みオブジェクトです。つまり、このオブジェクトは ASP システムで定義されているので、それを使用するだけで済みます。 Session(“..”) の .. は変数名に似ており、Session(“..”)=$$$ の $$$ は変数の値です。文章を書くだけで、このユーザーのすべてのページから変数の値にアクセスできます。

実際、ASP にはセッション、アプリケーション、クッキー、レスポンス、リクエスト、サーバーなどを含む合計 7 つの組み込みオブジェクトがあります。 JSPやPHPなど他のサーバーサイドスクリプト言語にも同様のオブジェクトがありますが、名前や使用方法が異なります。

ASPセッション機能の欠陥

現在、ASP開発者はセッションという強力な機能を利用していますが、使用中にASPセッションには以下の欠陥があることが判明しました:

プロセスの依存関係: ASPセッションのステータスは、 IIS のプロセス (プログラム inetinfo.exe)。したがって、inetinfo.exe プロセスがクラッシュすると、この情報は失われます。さらに、IIS サービスを再起動または終了すると、情報が失われる可能性があります。

セッションステータスの使用範囲の制限: ユーザーが1つのWebサイトから別のWebサイトにアクセスした場合、セッション情報は一緒に転送されません。例: Sina Web サイトには複数の WWW サーバーがある場合があります。ユーザーはログイン後、さまざまなチャネルを参照する必要がありますが、各チャネルが異なるサーバー上にある場合はどうすればよいでしょうか。

Cookie の依存関係: 実際、クライアントのセッション情報は Cookie に保存されます。クライアントが Cookie 機能を完全に無効にすると、セッションが提供する機能を楽しむことができなくなります。

ASP セッションの上記の欠陥を考慮して、Microsoft の設計者は ASP.NET セッションの設計および開発時に対応する改善を行い、上記の欠陥を完全に克服し、ASP.NET セッションをより強力な機能にしました。

Web.config ファイルの概要

一部の ASP.NET プログラマーは次のように言いました: Web.config ファイル?聞いたことはありませんが、私が書いたプログラムも普通に動くのではないでしょうか?はい、その通りです。Web.config ファイルがなくてもプログラムは通常どおり実行できます。ただし、大規模な Web サイトを構築し、Web サイト全体のページをどの言語で記述するか、Web サイトのセキュリティ認証モード、セッション情報の保存方法など、Web サイト全体の全体的な設定を行う必要がある場合は、 Web.config ファイルを使用します。 Web.config ファイルの一部のオプションは IIS を通じて構成できますが、Web.config に対応する設定がある場合は、IIS の構成が上書きされます。さらに、Web.config ファイルの最も便利な点は、System.web 名前空間を呼び出すことで、ASP.NET ページの Web.config の設定にアクセスできることです。

🎜 Web.config にはサーバー構成ファイルと Web アプリケーション構成ファイルの 2 種類があり、どちらも Web.config という名前です。この設定ファイルには、現在の IIS サーバー上の Web ページがどの言語で書かれているか、アプリケーションのセキュリティ認証モード、セッション情報の保存方法などの一連の情報が保存されます。この情報は XML 構文を使用して保存されているため、編集する場合はテキスト エディターを使用してください。 🎜

其中服务器配置文件会对IIS服务器下所有的站点中的所有应用程序起作用。在.NET Framework 1.0中,服务器的Web.config文件是存在:\WinNT\Microsoft.NET\Framework\v1.0.3705中的。

而Web应用程序配置文件Web.config则保存在各个Web应用程序中。例如:当前网站的根目录\Inetpub\wwwroot,而当前的Web应用程序为MyApplication,则Web应用程序根目录就应为:\Inetpub\wwwroot\MyApplication。如果你的网站有且只有一个Web应用程序,一般说来应用程序的根目录就是\Inetpub\wwwroot。如果想添加一个Web应用程序,在IIS中添加一个具有应用程序起始点的虚拟目录就行了。这个目录下的文件及目录将被视为一个Web应用程序。但是,这样通过IIS添加Web应用程序是不会为你生成Web.config文件的。如果想创建一个带有Web.config文件的Web应用程序,需要使用Visual Studio.NET,新建一个Web应用程序项目。

Web应用程序的配置文件Web.config是可选的,可有可无。如果没有,每个Web应用程序会使用服务器的Web.config配置文件。如果有,则会覆盖服务器Web.config配置文件中相应的值。

在ASP.NET中,Web.config修改保存后会自动立刻成效,不用再像ASP中的配置文件修改后需要重新启动Web应用程序才能生效了。

Web.config文件中的Session配置信息

打开某个应用程序的配置文件Web.config后,我们会发现以下这段:

<sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20" 
/>

这一段就是配置应用程序是如何存储Session信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。sessionState节点的语法是这样的:

<sessionState mode="Off|InProc|StateServer|SQLServer"
       cookieless="true|false"
       timeout="number of minutes"
       stateConnectionString="tcpip=server:port"
       sqlConnectionString="sql connection string"
       stateNetworkTimeout="number of seconds"
/>

必须有的属性是

ASP.NET Session使用详解

可选的属性是:

ASP.NET Session使用详解

ASP.NET中客户端Session状态的存储

在我们上面的Session模型简介中,大家可以发现Session状态应该存储在两个地方,分别是客户端和服务器端。客户端只负责保存相应网站的SessionID,而其他的Session信息则保存在服务器端。在ASP中,客户端的SessionID实际是以Cookie的形式存储的。如果用户在浏览器的设置中选择了禁用Cookie,那末他也就无法享受Session的便利之处了,甚至造成不能访问某些网站。为了解决以上问题,在ASP.NET中客户端的Session信息存储方式分为:Cookie和Cookieless两种。

ASP.NET中,默认状态下,在客户端还是使用Cookie存储Session信息的。如果我们想在客户端使用Cookieless的方式存储Session信息的方法如下:

找到当前Web应用程序的根目录,打开Web.Config文件,找到如下段落:

<sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20" 
/>

这段话中的cookieless="false"改为:cookieless="true",这样,客户端的Session信息就不再使用Cookie存储了,而是将其通过URL存储。关闭当前的IE,打开一个新IE,重新访问刚才的Web应用程序,就会看到类似下面的样子:

其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑体标出的就是客户端的Session ID。注意,这段信息是由IIS自动加上的,不会影响以前正常的连接。

ASP.NET中服务器端Session状态的存储

准备工作

为了您能更好的体验到实验现象,您可以建立一个叫做SessionState.aspx的页面,然后把以下这些代码添加到

中。
<scriptrunat="server">
Sub Session_Add(sender As Object, e As EventArgs)
   Session("MySession") = text1.Value
   span1.InnerHtml = "Session data updated! <P>Your session contains: <font color=red>" & \
            Session("MySession").ToString() & "</font>"
End Sub

Sub CheckSession(sender As Object, eAs EventArgs)
   If (Session("MySession")Is Nothing) Then
    span1.InnerHtml = "NOTHING, SESSION DATA LOST!"
   Else
    span1.InnerHtml = "Your session contains: <font color=red>" & \
             Session("MySession").ToString() & "</font>"
End If
End Sub
</script>
<formrunat="server"id="Form2">
   <inputid="text1"type="text"runat="server"name="text1">
   <inputtype="submit"runat="server"OnServerClick="Session_Add"
      value="Add to Session State" id="Submit1"name="Submit1">
   <inputtype="submit"runat="server"OnServerClick="CheckSession"
      value="View Session State" id="Submit2"name="Submit2">
</form>
<hrsize="1">
<fontsize="6"><spanid="span1"runat="server" /></font>

这个SessionState.aspx的页面可以用来测试在当前的服务器上是否丢失了Session信息。

将服务器Session信息存储在进程中

让我们来回到Web.config文件的刚才那段段落中:

<sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20" 
/>

当mode的值是InProc时,说明服务器正在使用这种模式。

这种方式和以前ASP中的模式一样,就是服务器将Session信息存储在IIS进程中。当IIS关闭、重起后,这些信息都会丢失。但是这种模式也有自己最大好处,就是性能最高。应为所有的Session信息都存储在了IIS的进程中,所以IIS能够很快的访问到这些信息,这种模式的性能比进程外存储Session信息或是在SQL Server中存储Session信息都要快上很多。这种模式也是ASP.NET的默认方式。

好了,现在让我们做个试验。打开刚才的SessionState.aspx页面,随便输入一些字符,使其存储在Session中。然后,让我们让IIS重起。注意,并不是使当前的站点停止再开始,而是在IIS中本机的机器名的节点上点击鼠标右键,选择重新启动IIS。(想当初使用NT4时,重新启动IIS必须要重新启动计算机才行,微软真是@#$%^&)返回到SessionState.aspx页面中,检查刚才的Session信息,发现信息已经丢失了。

将服务器Session信息存储在进程外

首先,让我们来打开管理工具->服务,找到名为:ASP.NET State Service的服务,启动它。实际上,这个服务就是启动一个要保存Session信息的进程。启动这个服务后,你可以从Windows任务管理器->进程中看到一个名为aspnet_state.exe的进程,这个就是我们保存Session信息的进程。

然后,回到Web.config文件中上述的段落中,将mode的值改为StateServer。保存文件后的重新打开一个IE,打开SessionState.aspx页面,保存一些信息到Session中。这时,让我们重起IIS,再回到SessionState.aspx页面中查看刚才的Session信息,发现没有丢失。

实际上,这种将Session信息存储在进程外的方式不光指可以将信息存储在本机的进程外,还可以将Session信息存储在其他的服务器的进程中。这时,不光需要将mode的值改为StateServer,还需要在stateConnectionString中配置相应的参数。例如你的计算你是192.168.0.1,你想把Session存储在IP为192.168.0.2的计算机的进程中,就需要设置成这样:stateConnectionString="tcpip=192.168.0.2:42424"。当然,不要忘记在192.168.0.2的计算机中装上.NET Framework,并且启动ASP.NET State Services服务。

将服务器Session信息存储在SQL Server中

首先,还是让我们来做一些准备工作。启动SQL Server和SQL Server代理服务。在SQL Server中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQL Server中创建一个用来专门存储Session信息的数据库,及一个维护Session信息数据库的SQL Server代理作业。我们可以在以下路径中找到那个文件:

[system drive]\winnt\Microsoft.NET\Framework\[version]\

然后打开查询分析器,连接到SQL Server服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫ASPState的数据库。但是这个数据库中只是些存储过程,没有用户表。实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中的,另外一个ASPStateTempApplications表存储了ASP中Application对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理->SQL Server代理->作业,发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息的。

接着,我们返回到Web.config文件,修改mode的值改为SQLServer。注意,还要同时修改sqlConnectionString的值,格式为:sqlConnectionString="data source=localhost; Integrated Security=SSPI;",其中data source是指SQL Server服务器的IP地址,如果SQL Server与IIS是一台机子,写127.0.0.1就行了。Integrated Security=SSPI的意思是使用Windows集成身份验证,这样,访问数据库将以ASP.NET的身份进行,通过如此配置,能够获得比使用userid=sa;password=口令的SQL Server验证方式更好的安全性。当然,如果SQL Server运行于另一台计算机上,你可能会需要通过Active Directory域的方式来维护两边验证的一致性。


更多ASP.NET Session使用详解相关文章请关注PHP中文网!


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
C言語でchar配列の使用方法C言語でchar配列の使用方法Apr 03, 2025 pm 03:24 PM

Char Arrayは文字シーケンスをC言語で保存し、char array_name [size]として宣言されます。アクセス要素はサブスクリプト演算子に渡され、要素は文字列のエンドポイントを表すnullターミネーター「\ 0」で終了します。 C言語は、strlen()、strcpy()、strcat()、strcmp()など、さまざまな文字列操作関数を提供します。

C言語でさまざまなシンボルを使用する方法C言語でさまざまなシンボルを使用する方法Apr 03, 2025 pm 04:48 PM

c言語のシンボルの使用方法は、算術、割り当て、条件、ロジック、ビット演算子などをカバーします。算術演算子は基本的な数学的操作に使用されます。割り当てと追加、下位、乗算、除算の割り当てには、条件操作に使用されます。ポインター、ファイル終了マーカー、および非数値値。

C文字列におけるcharの役割は何ですかC文字列におけるcharの役割は何ですかApr 03, 2025 pm 03:15 PM

Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。

C言語で特殊文字を処理する方法C言語で特殊文字を処理する方法Apr 03, 2025 pm 03:18 PM

C言語では、以下などのエスケープシーケンスを通じて特殊文字が処理されます。\ nはラインブレークを表します。 \ tはタブ文字を意味します。 ESACEシーケンスまたは文字定数を使用して、Char C = '\ n'などの特殊文字を表します。バックスラッシュは2回逃げる必要があることに注意してください。さまざまなプラットフォームとコンパイラが異なるエスケープシーケンスを持っている場合があります。ドキュメントを参照してください。

マルチスレッドと非同期C#の違いマルチスレッドと非同期C#の違いApr 03, 2025 pm 02:57 PM

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

C言語でCharを変換する方法C言語でCharを変換する方法Apr 03, 2025 pm 03:21 PM

C言語では、charタイプの変換は、キャスト:キャスト文字を使用することにより、別のタイプに直接変換できます。自動タイプ変換:あるタイプのデータが別のタイプの値に対応できる場合、コンパイラは自動的に変換します。

C言語合計の機能は何ですか?C言語合計の機能は何ですか?Apr 03, 2025 pm 02:21 PM

C言語に組み込みの合計機能はないため、自分で書く必要があります。合計は、配列を通過して要素を蓄積することで達成できます。ループバージョン:合計は、ループとアレイの長さを使用して計算されます。ポインターバージョン:ポインターを使用してアレイ要素を指し示し、効率的な合計が自己概要ポインターを通じて達成されます。アレイバージョンを動的に割り当てます:[アレイ]を動的に割り当ててメモリを自分で管理し、メモリの漏れを防ぐために割り当てられたメモリが解放されます。

C言語のcharとwchar_tの違いC言語のcharとwchar_tの違いApr 03, 2025 pm 03:09 PM

C言語では、charとwchar_tの主な違いは文字エンコードです。CharはASCIIを使用するか、ASCIIを拡張し、WCHAR_TはUnicodeを使用します。 Charは1〜2バイトを占め、WCHAR_Tは2〜4バイトを占有します。 charは英語のテキストに適しており、wchar_tは多言語テキストに適しています。 CHARは広くサポートされており、WCHAR_TはコンパイラとオペレーティングシステムがUnicodeをサポートするかどうかに依存します。 CHARの文字範囲は限られており、WCHAR_Tの文字範囲が大きく、特別な機能が算術演算に使用されます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター