【问题标题】:What, logically and physically, is a session?什么是逻辑和物理上的会话?
【发布时间】:2011-11-16 16:02:48
【问题描述】:

这是一个关于某些概念的非常基本的问题。

在 Web 服务器(如 IIS 或 Apache)的上下文中,会话的定义是什么。什么是物理上和逻辑上的会话?

如何确定会话是开始还是结束?使用服务器端计时器之类的?

【问题讨论】:

  • 唷,我做了一些史诗般的编辑。这回答了你的问题吗?

标签: asp.net session iis


【解决方案1】:

从物理上讲,它是用于维护客户端和服务器之间某种连接状态的内存空间。在 ASP.NET 上,会话对用户来说是唯一的;这与缓存不同,缓存是应用程序所有用户共享的内存空间。

通常会话通过 cookie 维护(服务器向客户端的浏览器发送一个包含唯一会话 ID 的 cookie),但是当浏览器不接受 cookie 时,通常通过以下形式的 url 参数维护: http://site.com?SessionID=312da312312。服务器使用此 SessionID 来跟踪谁在建立连接。

从逻辑上讲,Wikipedia 很好地解释了这个概念:

在计算机科学中,尤其是网络,会话是 半永久性交互式信息交换,也称为 两个或更多人之间的对话、谈话或会议 通信设备,或计算机和用户之间(请参阅登录 会议)。会话在某个时间点建立或建立 时间,并在稍后的时间点拆除。一个既定的 通信会话可能在每个会话中涉及多个消息 方向。会话通常(但不总是)是有状态的,意味着 至少有一个通信部分需要保存信息 关于会话历史,以便能够进行通信,如 与无状态通信相反,其中通信包括 带有响应的独立请求。

已建立的会话是执行任务的基本要求 面向连接的通信。会话也是基本步骤 以无连接通信模式传输。然而任何 单向传输未定义 session1

【讨论】:

  • 很好,但我尽量不鼓励人们使用无 cookie(URL 令牌)会话,因为如果 URL 被重复使用(被搜索引擎索引、在链接中复制等),它们可能会造成严重破坏
  • @JamesMcCormack:毫无疑问,这会带来严重的安全隐患。
【解决方案2】:

在网络术语中,会话是用户对网站的访问,当用户在网站中导航时,它可能包含多次页面查看和交互。用户做出的选择和任何输入的数据都可以在会话期间保存并重新显示或用于在会话期间相应地定制用户体验。关键是 Session 代表用户和网站之间的一组交互,而不是提供静态页面的简单运行。会话预计只会持续很短的时间;如果用户停止向站点发出请求,几分钟后会话被视为结束。

HTTP 是无状态的,因此就浏览器和 Web 服务器之间的关系而言,会话不作为 物理 实体存在。

逻辑上,ASP.NET 通过识别用户对站点的重复调用并在调用之间保留会话状态信息来模拟会话。

当用户第一次访问网站时,它通过在 cookie 中为每个用户分配一个唯一的令牌(“会话 ID”)来实现这一点。用户随后每次调用该站点时,都会显示 cookie。 ASP.NET 识别它并从持久性介质中调用该令牌的任何持久会话数据(ASP.NET 将其存储在服务器端,内存中、状态服务器中或 SQL 数据库中)。应用程序可以在 HTTP 请求的生命周期内读取和修改会话数据,通常是为了响应用户的操作。在请求结束时,会话数据被返回到持久化介质中。

通过这种方式,保留了开放、连续会话的假象。会话的开始很容易判断 - 这是第一次向用户提供令牌,并且会话记录存储在带有时间戳的持久性介质中。关于会话何时结束没有简单的答案,因为 HTTP 天生是无状态的。因此,我们必须假设会话应该在用户没有返回站点的情况下经过给定的时间后关闭。这只能通过 cookie 过期或通过与会话数据上的时间戳进行比较从持久性介质中删除会话记录来强制执行,使用我们选择的任意超时。 ASP.NET 中的默认值为 20 分钟。

有趣的一点是,当使用 SQL Server 作为 ASP.NET 的会话持久性介质时,它使用计划的 SQL Server 代理任务来清除过期的会话。但是,如果代理未运行或不受支持(例如,在 SQL Server Express 版本的情况下),则不会清除过期会话,因此只要用户继续提供相同的会话令牌,会话就不会结束。实际上,会话将在用户关闭浏览器时结束,因为 cookie应该然后被自动丢弃。

然而,要回答您的具体问题,请注意我一直在讨论应用程序服务器 (ASP.NET) 上下文中的会话。 Web 服务器 (IIS) 根本没有会话的概念 - 它唯一的作用是在将请求传递给 ASP.NET 时提供和读取 cookie。

【讨论】:

  • 如果会话在物理上不存在,那么持久会话数据是什么?
  • 这只是 App Server 与唯一会话令牌相关联的数据。
【解决方案3】:

这里是 MSDN link

基本上有 3 种不同的方式来存储会话。在进程/状态服务器/SQL。

In Process 存储在 IIS 中,如果您回收或重新启动 Web 服务器,则会丢失。它是最快的,但它不会持续存在。

状态服务器:它是一个与您的 .NET 应用程序无关的进程外工作进程。但是,如果您的服务器重新启动,您会丢失该会话,但您可以重新启动您的应用程序池

SQL:它存储在 SQL 中并始终保持不变。

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 1970-01-01
    • 2015-06-25
    • 2022-10-17
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多