asp.net 第二次用户登录后服务器会话为空



我有一个 ASP.net(vb)站点,登录后,我将userID保存在会话中(就像我在php中一样)并刷新页面。 只是:

Session("UserID")=1

这对第一个用户工作正常。如果另一个用户从其他计算机登录,而第一个用户仍在登录,则用户 ID 进入会话没有问题,例如

Session("UserID")=2

。但是在我重新加载页面后,第二个用户的会话是空的。 我一直在 php 中使用会话,但似乎在 asp 中这的工作方式不同。有人可以解释一下asp中这种行为的原因是什么,我该怎么办?

编辑: 我的网络配置如果有帮助:

<configuration>
<location path="ScriptResource.axd">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="WebServiceHandlerFactory-Integrated"/>
<remove name="ScriptHandlerFactory"/>
<remove name="ScriptHandlerFactoryAppServices"/>
<remove name="ScriptResource"/>
<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<remove name="ChartImageHandler" />
<add name="ChartImageHandler" preCondition="integratedMode" verb="GET,HEAD,POST"
path="ChartImg.axd" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</handlers>
</system.webServer>
<appSettings>
<add key="LoadEJResourcesFromAssembly" value="true" />
<add key="EJResources" value="jsrender:true;themes:true;" />
<add key="ChartImageHandler" value="storage=file;timeout=20;dir=c:TempImageFiles;" />
</appSettings>
<system.web>
<httpHandlers>
<add path="ChartImg.axd" verb="GET,HEAD,POST" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
validate="false" />
<add verb="GET" path="ScriptResource.axd" type="Microsoft.Web.Handlers.ScriptResourceHandler" validate="false"/>      
</httpHandlers>
<customErrors mode="Off"/>
<trust level="Full" originUrl=""/>
<globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8" culture="hu-HU" uiCulture="hu-HU"/>
<authorization>
<deny users="?"/>
</authorization>
<authentication mode="Forms">
<forms protection="All" loginUrl="~/Login" timeout="180" slidingExpiration="true" cookieless="UseCookies" />
</authentication>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.5.2">
<assemblies>
<add assembly="Syncfusion.EJ.Web, Version=15.3460.0.26, Culture=neutral, PublicKeyToken=3D67ED1F87D44C89"/>
<add assembly="Syncfusion.EJ, Version=15.3460.0.26, Culture=neutral, PublicKeyToken=3D67ED1F87D44C89"/>
<add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</assemblies>
</compilation>
<httpRuntime targetFramework="4.5.2" requestValidationMode="2.0"/>
<pages>
<namespaces>
<add namespace="System.Web.Optimization" />
</namespaces>
<controls>
<add tagPrefix="webopt" namespace="Microsoft.AspNet.Web.Optimization.WebForms"
assembly="Microsoft.AspNet.Web.Optimization.WebForms" />
<add tagPrefix="ajaxToolkit" namespace="AjaxControlToolkit" assembly="AjaxControlToolkit" />
<add tagPrefix="ej" namespace="Syncfusion.JavaScript.Web" assembly="Syncfusion.EJ.Web, Version=15.3460.0.26, Culture=neutral, PublicKeyToken=3d67ed1f87d44c89" />
<add tagPrefix="ej" namespace="Syncfusion.JavaScript.Web" assembly="Syncfusion.EJ, Version=15.3460.0.26, Culture=neutral, PublicKeyToken=3d67ed1f87d44c89" />
<add tagPrefix="ej" namespace="Syncfusion.JavaScript.Models"
assembly="Syncfusion.EJ, Version=15.3460.0.26, Culture=neutral, PublicKeyToken=3d67ed1f87d44c89" />
<add tagPrefix="ej" namespace="Syncfusion.JavaScript.DataVisualization.Models"
assembly="Syncfusion.EJ, Version=15.3460.0.26, Culture=neutral, PublicKeyToken=3d67ed1f87d44c89" />
<add tagPrefix="asp" namespace="System.Web.UI.DataVisualization.Charting"
assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</controls>
</pages>
</system.web>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed"/>
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="WebGrease" culture="neutral" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.codedom/>

如果是这种情况,则很可能是由 web.config 中 sessionState 的错误配置引起的。 从文档中:

mode="[Off|InProc|StateServer|SQLServer|Custom]"
timeout="number of minutes"
cookieName="session identifier cookie name"
cookieless=
"[true|false|AutoDetect|UseCookies|UseUri|UseDeviceProfile]"
regenerateExpiredSessionId="[True|False]"
sessionIDManagerType="session manager type"
sqlConnectionString="sql connection string"
sqlCommandTimeout="number of seconds"
allowCustomSqlDatabase="[True|False]"
useHostingIdentity="[True|False]"
stateConnectionString="tcpip=server:port"
stateNetworkTimeout="number of seconds"
customProvider="custom provider name"
compressionEnabled="[True|False]"
sqlConnectionRetryInterval="number of seconds">
<providers>...</providers>
</sessionState>

最有可能的罪魁祸首是"模式"和"无cookie"。对于测试,请使用 mode=InProc(这是默认值)。 如果模式=关闭,您将遇到问题,如果模式=自定义,则自定义实现可能会损坏。

如果设置了无 Cookie 选项,则在设置为 UseDeviceProfile 时可能会失败。如果计算机相同且位于同一 NAT 设备后面,则设备配置文件可能会发生冲突。若要进行测试,请设置为 false 或删除设置以使用默认值。

如果您使用 InProc 并且 cookieless 为假,则其他设置大多不适用,除了 cookieName,它不太可能破坏事物。

编辑:我找不到在堆栈溢出上设置 ASP.net 状态服务器的好说明。我确实推荐这种方法,因为在我看来,InProc 方法会有些不可预测地丢失会话。

  • 窗口中启动"服务"应用程序(在Win10和Win Server上相同)
  • 查找"ASP.NET 国家服务">
  • 右键单击并将启动类型更改为"自动">
  • 此外,要立即启动,请右键单击该服务并选择启动。
  • 在您的 web.config 中,按如下方式设置 sessionState 标记

    <会话状态 mode="StateServer" stateConnectionString="tcpip=localhost:42424" cookieless="UseCookies" 超时="25">

  • sessionState 标记位于部分中。

最新更新