-
2015-11-27 10:02:47
对于服务器程序来说,有个基本假设,即服务器是基于状态请求,还是基于无状态请求。根据这个假设,可以将服务器划分为状态服务器和无状态服务器。
状态服务器
如果是状态化请求,那么服务端一般需要保存请求的相关信息,每个请求可以默认地使用以前的请求信息。
状态服务器具有以下特点:
- 保存客户请求的数据(状态)
- 服务端容易对客户状态进行管理
- 服务端并不要求每次客户请求都携带额外的状态数据无状态服务器
无状态服务器处理的客户信息必须全部来自于请求所携带的信息以及其他服务器自身所保存的、并且可以被所有请求所使用的公共信息。
无状态服务器具有以下特点:
- 并不保存客户请求的数据(状态)
- 客户在请求时需要携带额外的状态数据
- 无状态服务器更加健壮,重启服务器不会丢失状态信息,这使得维护和扩容更加简单无状态的服务器程序,最著名的就是WEB服务器。
每次HTTP请求和以前请求没有直接关联。
为了跟踪客户请求的状态信息,请求中加入COOKIE。
COOKIE的存在,是无状态化向状态化过渡的一种手段。参考资料
更多相关内容 -
无法向会话状态服务器发出会话状态请求 错误的解决方法
2015-01-16 11:27:03无法向会话状态服务器发出会话状态请求 错误的解决方法 当WEBCONFIG文件中设置SESSION存储方式设置为mode="StateServer" />这种方式的时候,需要打开计算机管理--服务,开启aspnet_state服务(ASP.NET...无法向会话状态服务器发出会话状态请求 错误的解决方法
当WEBCONFIG文件中设置SESSION存储方式设置为<sessionState
mode="StateServer" />这种方式的时候,需要打开计算机管理--服务,开启aspnet_state服务(ASP.NET状态服务) ,若未开启,就会出现“无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection 的值,确保服务器接受远程请求。如果服务器位于本地计算机上,并且上面提到的注册表值不存在或者设置为 0,则状态服务器连接字符串必须使用“localhost”或“127.0.0.1”作为服务器名称。 ”这种错误。
以下转贴SESSION知识
关于SESSION
ASPSession的功能的缺陷
目前ASP的开发人员都正在使用Session这一强大的功能,但是在他们使用的过程中却发现了ASPSession有以下缺陷:
进程依赖性:ASPSession状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。
Session状态使用范围的局限性:刚一个用户从一个网站访问到另外一个网站时,这些Session信息并不会随之迁移过去。例如:新浪网站的WWW服务器可能不止一个,一个用户登录之后要去各个频道浏览,但是每个频道都在不同的服务器上,如果想在这些WWW服务器共享Session信息怎么办呢?
Cookie的依赖性:实际上客户端的Session信息是存储与Cookie中的,如果客户端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
鉴于ASPSession的以上缺陷,微软的设计者们在设计开发 ASP.NET Session时进行了相应的改进,完全克服了以上缺陷,使得ASP.NET Session成为了一个更加强大的功能。
在ASP.NET中,Web.config修改保存后会自动立刻成效,不用再像ASP中的配置文件修改后需要重新启动Web应用程序才能生效了。
Web.config文件中的Session配置信息
打开某个应用程序的配置文件Web.config后,我们会发现以下这段:
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>
这一段就是配置应用程序是如何存储Session信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。sessionState节点的语法是这样的:
<sessionStatemode="Off|InProc|StateServer|SQLServer"
cookieless="true|false"
timeout="number of minutes"
stateConnectionString="tcpip=serverort" //StateServer时必须的
sqlConnectionString="sql connection string" //SQLServer时必须的
stateNetworkTimeout="number of seconds"
/>
必须有的属性是
属性选项 描述
mode设置将Session信息存储到哪里
Off设置为不使用Session功能
InProc设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。
StateServer设置为将Session存储在独立的状态服务中。
SQLServer设置将Session存储在SQL Server中。
可选的属性是:
属性选项 描述
cookieless设置客户端的Session信息存储到哪里
ture使用Cookieless模式
false使用Cookie模式,这是默认值。
timeout设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟
stateConnectionString设置将Session信息存储在状态服务中时使用的服务器名称和端口号,例如:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必需的。
sqlConnectionString设置与SQL Server连接时的连接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。当mode的值是SQLServer时,这个属性是必需的。
stateNetworkTimeout设置当使用StateServer模式存储Session状态时,经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。
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="datasource=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>
这段话中的cookieless="false"改为:cookieless="true",这样,客户端的Session信息就不再使用Cookie存储了,而是将其通过URL存储。
ASP.NET中服务器端Session状态的存储
准备工作
为了您能更好的体验到实验现象,您可以建立一个叫做SessionState.aspx的页面,然后把以下这些代码添加到中。
<scriptrunat="server">
SubSession_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>"
EndSub
SubCheckSession(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>"
EndIf
EndSub
<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="datasource=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>
当mode的值是InProc时,说明服务器正在使用这种模式。
这种方式和以前ASP中的模式一样,就是服务器将Session信息存储在IIS进程中。当IIS关闭、重起后,这些信息都会丢失。但是这种模式也有自己最大好处,就是性能最高。应为所有的Session信息都存储在了IIS的进程中,所以IIS能够很快的访问到这些信息,这种模式的性能比进程外存储Session信息或是在SQLServer中存储Session信息都要快上很多。这种模式也是ASP.NET的默认方式。
好了,现在让我们做个试验。打开刚才的SessionState.aspx页面,随便输入一些字符,使其存储在Session中。然后,让我们让IIS重起。注意,并不是使当前的站点停止再开始,而是在IIS中本机的机器名的节点上点击鼠标右键,选择重新启动IIS。(想当初使用NT4时,重新启动IIS必须要重新启动计算机才行,微软真是@#$%^&)返回到SessionState.aspx页面中,检查刚才的Session信息,发现信息已经丢失了。
将服务器Session信息存储在进程外
首先,让我们来打开管理工具->服务,找到名为:ASP.NETState 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的计算机中装上.NETFramework,并且启动ASP.NET State Services服务。
将服务器Session信息存储在SQLServer中
首先,还是让我们来做一些准备工作。启动SQLServer和SQL Server代理服务。在SQL Server中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQL Server中创建一个用来专门存储Session信息的数据库,及一个维护Session信息数据库的SQL Server代理作业。我们可以在以下路径中找到那个文件:
[systemdrive]\winnt\Microsoft.NET\Framework\[version]\
然后打开查询分析器,连接到SQLServer服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫ASPState的数据库。但是这个数据库中只是些存储过程,没有用户表。实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中的,另外一个ASPStateTempApplications 表存储了ASP中Application对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理->SQL Server代理->作业,发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息的。
接着,我们返回到Web.config文件,修改mode的值改为SQLServer。注意,还要同时修改sqlConnectionString的值,格式为:
sqlConnectionString="datasource=localhost; Integrated Security=SSPI;"
其中datasource是指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域的方式来维护两边验证的一致性。
同样,让我们做个试验。向SessionState.aspx中添加Session信息,这时发现Session信息已经存在SQLServer中了,即使你重起计算机,刚才的Session信息也不会丢失。现在,你已经完全看见了Session信息到底是什么样子的了,而且又是存储在SQL Server中的,能干什么就看你的发挥了,哈哈。
总结
通过这篇文章,你可以看到在Session的管理和维护上,ASP.NET比ASP有了很大的进步,我们可以更加随意的挑选适合的方法了。对于企业级的应用来说,这无疑对于服务器的同步、服务器的稳定性、可靠性都是有利的。相信在强大的微软支持下,新一代的电子商务平台将会搭建的更好 -
"无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动"问题...
2017-08-28 11:38:33异常详细信息: System.Web.HttpException: 无法向会话状态服务器发出会话状态请求。请确保已启动 ASP.NET State service,并且客户端和服务器端口是相同的。如果服务器位于远程计算机上,请检查 HKEY_LOCAL_MACHINE\...异常详细信息: System.Web.HttpException: 无法向会话状态服务器发出会话状态请求。请确保已启动 ASP.NET State service,并且客户端和服务器端口是相同的。如果服务器位于远程计算机上,请检查 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection 的值,确保服务器接受远程请求。
源错误:
执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
方法一:
在"管理工具"中的"服务"启动"ASP.NET State Service"
方法二:
web.config中配置SessionState的mode为StateServer,但指定的服务器没有开启那个服务。
方法二:
web.config中配置SessionState的mode为StateServer,但指定的服务器没有开启那个服务。
改成InProc即可。方法三:
把杀毒软件关掉,他可以以为运行生成的文件是带病毒的,会跟你阻止页面生成
-
服务器的鱼和熊掌,有状态or无状态
2021-10-23 12:35:57如果我们刚开始新游戏项目的服务器开发,会遇到服务器状态选择问题,游戏项目是用有状态服务器还是无状态服务器? 是什么? 服务器状态简单来说客户端的多次请求具有上下文关系。比如客户端登录后,后续请求...问题引入
如果我们刚开始新游戏项目的服务器开发,会遇到服务器状态选择问题,游戏项目是用有状态服务器还是无状态服务器?
是什么?
服务器状态简单来说客户端的多次请求具有上下文关系。比如客户端登录后,后续请求其他业务时客户端不用再发玩家信息。
从服务器状态角度来说,服务器分为有状态服务器和无状态服务器。
有状态服务器就是在服务器端保存有关客户端的相关信息,方便该玩家的后续请求不用再发玩家的基础请求信息。比如玩家的基础信息(角色id,区服id)。在服务端保存客户端的一些信息,可以减少客户端传输的数据量。主要应用场景:游戏服务器。
无状态服务器就是服务器不保存客户端的相关信息,客户端每次请求都需要带基础请求信息,比如玩家的角色id。客户端就可以将请求发送到任意一台服务器上,实现水平扩展。主要应用场景:web服务器。
怎么使用?
服务器是根据session来识别客户端的。
- 对于有状态服务器来说,我们可以在服务端保存客户端session,服务端根据客户端session在缓存或者内存处拿到客户端基础信息。
- 对于无状态服务器来说,不需要再服务端保存任何信息,客户端每次请求都是独立的。
扩展知识
有状态变无状态
游戏服务器最希望实现的功能就是服务器能够平滑升级,实现不停机维护。
服务器是否有状态根本在于是否会保存session,我们可以在公共存储的地方保存session,比如在redis中保存。在这种情况下,服务器不保存客户端状态,变成无状态服务器,可以做到水平扩展。
-
服务器状态查询,魔兽怀旧服务器状态查询
2021-07-31 09:50:49魔兽怀旧服务器状态查询178.多玩。进去还看不到的话。估计官网问题,貌似今天周二还是维护。所以你懂的魔兽世界怀旧服阵营比例现在还无法查询。过一段时间统计出来之后,可以在魔兽世界人口普查... -
服务器无状态与有状态解释
2018-01-25 23:06:38根据这个假设,可以将服务器划分为状态服务器和无状态服务器。 状态服务器 如果是状态化请求,那么服务端一般需要保存请求的相关信息,每个请求可以默认地使用以前的请求信息。 状态服务器具有以下特点: ... -
无法向会话状态服务器发出会话状态请求请。确保 ASP.NET State Service (ASP.NET 状态服务)已启动
2008-02-13 12:54:00无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查 HKEY_LOCAL_MACHINE/SYSTEM/... -
c# 连接字符串数据库服务器端口号 .net状态服务器端口号
2009-06-15 11:06:00正常的数据库连接字符串配置,这是在MSSQL服务器端口是1433(默认)的情况下。server=.;uid=Admin;pwd=admin;database=db;">但是有时候,为了数据库服务器安全,这个端口会被改成其它的,这时再连接数据库可能报出... -
服务器状态码
2019-06-29 21:05:04服务器常用的状态码及其对应的含义如下: 200:服务器响应正常。 304:该资源在上次请求之后没有任何修改(这通常用于浏览器的缓存机制,使用GET请求时尤其需要注意)。 400:无法找到请求的资源。 401:访问... -
无状态服务 VS 有状态服务
2019-01-15 11:47:10对服务器程序来说,究竟是有状态服务,还是无状态服务,其判断依旧是指两个来自相同发起者的请求在服务器端是否具备上下文关系。如果是状态化请求,那么服务器端一般都要保存请求的相关信息,每个请求可以默认地使用... -
有状态服务和无状态服务的区别是啥?阿巴阿巴
2020-10-04 12:08:33对服务器程序来说,究竟是有状态服务,还是无状态服务,其判断依据——两个来自相同发 起者的请求在服务器端是否具备上下文关系。 2.无状态服务(常见JWT) 无状态请求,服务器端所能够处理的数据全部来自于请求所... -
无法向会话状态服务器发出会话状态请求。请确保已启动 ASP.NET State service,并且客户端和服务器端口保持...
2010-12-17 10:22:00无法向会话状态服务器发出会话状态请求。请确保已启动 ASP.NET State service,并且客户端和服务器端口保持相同。无法向会话状态服务器发出会话状态请求。请确保已启动 ASP.NET State service,并且客户端和服务器... -
无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且...
2011-09-26 09:38:17无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查 HKEY_LOCAL_MACHINE\SYSTEM\... -
解决方案:FileZillaClient服务器发回了不可路由的地址,使用服务器地址代替
2020-10-07 00:07:14状态: 服务器发回了不可路由的地址。使用服务器地址代替。 命令: MLSD 错误: GnuTLS 错误 -110: The TLS connection was non-properly terminated. 状态: 服务器没有正常的关闭 TLS 连接 错误... -
向服务器发送请求,服务器返回给客户端的响应状态码列表及其代表含义
2020-01-02 21:51:28响应状态码表示服务器的响应状态,在爬虫开发过程中,向服务器发送一个请求,服务器会根据用户的请求返回相应的响应,响应分为三类:响应状态码、响应头和响应体。 在爬虫开发过程中,可以根据服务器返回的响应状态... -
有状态和无状态服务器
2009-02-27 09:28:00不保存状态信息的服务器称为无状态服务器,反之称为有状态服务器。 对高效率的要求,促使设计者再服务器内保存状态信息。在服务器中保存少量信息可以减少客户和服务器之间交换报文的大小,并使得服务器快速相应请求... -
Linux查看服务器运行状态
2019-12-21 22:03:29systemctl status 服务器 -
Ajax库-认识服务器,URL地址,axios基本用法,响应状态码,业务状态码,接口测试工具
2022-01-10 16:08:27Ajax库-认识服务器,URL地址,axios基本用法,响应状态码,业务状态码,接口测试工具 -
如何查看服务器GPU状态
2020-04-18 23:29:22nvidia-smi GPU:GPU 编号; Name:GPU 型号; Persistence-M:持续模式的状态。持续模式虽然耗能大,但是在...Perf:性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能(即 GPU 未工作时为P0,达到最大工... -
遇到问题--hadoop---cdh识别不到服务器状态
2018-04-08 17:52:49公司停电之后回来看到集群情况如下,主要问题是cdh识别不到其中一台服务器状态。 这种情况下重启整个集群会超时失败。 原因 识别不到的可能原因有三个: 一是服务器没有启动 二是cm客户端程序没有启动 三是... -
DELL服务器查看阵列和硬盘状态
2021-06-17 14:50:501、开机按F2进入System Setup管理界面 2、选择Device Settings 3.选择第一项Integrated RAID controller 1:DELL PERC Configuration Utility...按ESC返回上一层选择physical disk management即可查看机器内所有硬盘状态 -
服务器状态检测工具
2018-03-08 21:28:591、对服务进程进行监测,提供监测状态(开启/关闭) 2、提供按钮进行开启/关闭/重启 3、提供按钮支持Tomcat, Unabackup服务重启 4、服务包括 服务器名 进程名 MTS(主控服务器) cn.com.xxx.mts ... -
第一章:阿里云服务器重置(ESC)将ECS服务器重置为初始化状态
2021-11-14 13:31:00个人简介: 我是廖志伟,一名Java开发工程师,CSDN博客专家,多年一线...阿里云服务器重置(ESC)将ECS服务器重置为初始化状态 操作描述: 第一步:重置实例密码,改用服务器的实例id作为演示登录的密码 第二步:开发 -
HTTP状态500-内部服务器错误
2020-12-15 11:29:55SSM整合时出现的问题 起初关注点一直在Mapper.xml上,CSDN查询解决方法大致在这样几种。 1.SQL语句问题 2.resultType返回类型问题(List集合中的参数类型) 3.database.properties数据库配置文件问题(Mysql8以上加... -
nginx查看服务器状态信息
2019-06-16 12:23:351)编译安装时使用–with-http_stub_status_module开启状态页面模块 [root@proxy ~]# yum -y install gcc pcre-devel openssl-devel //安装常见依赖包 [root@proxy ~]# tar -zxvf nginx-1.12.2.tar.gz [root@proxy... -
HTTP状态 500 - 内部服务器错误
2020-10-24 08:35:04Tomcat启动访问网页出现500 出现错误原因:新定义了一个对象ds 解决方法: 将DataSource ds = DruidDataSourceFactory.createDataSource(pro);DataSource去掉就可以了。 -
linux服务器查看防火墙状态
2017-07-29 20:03:43首先,查看防火墙的状态,service iptables status可以查看到iptables服务的当前状态,通过下图绿色部分可以看出当前防火墙的状态是开启的,我们也可以通过iptables -L 命令来查看防火墙的规则。 接下来就是启动...