C# MVC4:如何在IIS重启后保持会话和cookie仍然有效?

C# MVC4:如何在IIS重启后保持会话和cookie仍然有效?,c#,asp.net,asp.net-mvc,session,cookies,C#,Asp.net,Asp.net Mvc,Session,Cookies,IIS服务器重新启动后,我的登录会话(使用简单成员身份)和cookie(验证令牌)似乎无效。这对我来说是一个问题,如果一个用户在事务中间,然后服务器重新启动,用户必须重新填充表单并再次进行,也可能在进程中间中断事务时出现一些代码问题。 如何使它们在服务器重启后仍然有效 这是我的web.config: <membership /> ... <sessionState mode="InProc" cookieless="false" timeout="2880" /> ...

IIS服务器重新启动后,我的登录会话(使用简单成员身份)和cookie(验证令牌)似乎无效。这对我来说是一个问题,如果一个用户在事务中间,然后服务器重新启动,用户必须重新填充表单并再次进行,也可能在进程中间中断事务时出现一些代码问题。 如何使它们在服务器重启后仍然有效

这是我的web.config:

<membership />
...
<sessionState mode="InProc" cookieless="false" timeout="2880" />
...
<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication> 
...
<staticContent>
  <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
  <remove fileExtension=".woff" />
  <remove fileExtension=".woff2" />
  <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
  <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
</staticContent>

...
...
...

更新 我尝试使用SQLServer存储会话状态。然后出现了新的问题,我不能使用
ViewBag
,因为它不可
序列化


还有别的办法吗?

没有办法做到这一点。您可以始终使用
数据库
文件
来保存会话和cookie值

您可以序列化要保留在
会话
Cookie
中的对象。我使用很多工具为您进行序列化。然后将其与会话密钥一起作为字符串存储在DB中


要取回它,您只需根据会话键启动一个查询,获取字符串并对其进行反序列化即可:)

默认情况下,会话数据存储在内存中。因此,当IIS重新启动时,您丢失了它。您可以考虑其他的PROC SESSION状态提供程序来存储数据,例如数据库、SSESTOSTATE Service。

< P> Cookie被存储在客户端浏览器中,并在每次请求时发送到服务器。因此,可以跨IIS重新启动或AppDomain recyles使用Cookie

默认情况下,会话数据不会在AppDomain回收或IIS重新启动期间保留。实现这一点的唯一方法是使用类似SQL server的会话状态提供程序

要使其工作,会话状态提供程序需要能够序列化/反序列化数据,以便从数据库中持久化和还原数据,这意味着您需要使用会话中可序列化的类型


您可以将代码更改为使用其他可序列化的类型,或者将数据存储在cookie中。

您可能需要将会话存储在数据库中,希望本教程对您有所帮助

如果您在尝试持久化会话时遇到有关viewbag的错误,则表示您正在会话中存储viewbag。你真的需要吗?我认为您应该避免在会话中存储viewbag,如果您真的想这样做,应该使用您自己的可序列化自定义类。也许一本通用词典也能满足你的需要。。。然后将会话持久化到数据库中,或者如果您想重新发明轮子,请实现您的自定义会话。一般来说,使用会话存储信息从来都不是一个好方法 实践中有很多原因,主要是服务器重启时数据丢失。据我所知,在您的web应用程序中,您正在使用会话来存储发布的数据,正确的方法是将会话中继到viewmodel类。

将会话保留在群集数据库(主控)中,以便一个会话失败,另一个会话将接管

localStorage(自己浏览器的存储)可用于本地存储数据,而无需使用cookie


以下是W3Schools链接:

简单来说,您无法做到这一点,使用键值数据库是将会话保存在内存中的最佳选择(如redis),而且它比关系数据库(如sql server)快得多


将数据保存在本地存储或cookie中可能会导致数据丢失或安全问题

也许我迟到了,但我正在做下一件事,以便在iisreset之后继续治疗。我正在使用IIS 10,但也许它可以在其他版本中使用:

  • 在IIS配置管理器(InetMgr.exe)上,单击会话状态

  • 选择“状态服务器”并单击应用

  • 启动Windows服务“ASP.NET状态服务”(如果要在重新启动计算机后使用,可以将其更改为自动)。


  • 之后,您可以重置iis并保持会话。

    我听到类似于
    cookieless=“true”
    cookieless=“UseCookies”
    的声音是什么?这对我的网站有帮助吗?
    cookieless
    指定会话id的存储位置。如果为真,则将通过url发送,如果为假,则将存储在
    cookies
    中<代码>会话ID
    被web服务器用来为当前用户选择合适的会话对象。所以这不是你的解决方案。所以我只有两个选择。数据库或文件,您是否有任何示例参考?什么示例?如何在文件或数据库中存储持久会话的示例。实际上我更喜欢文件,因为它不会造成性能损失,不是吗?会话存储在服务器上,因此如果服务器重新启动,则会话将丢失,但是您可以使用cookies存储数据,因为数据存储在客户端计算机上。您是否尝试在web.config中设置Machinekey而不是使用自动生成类型?重新启动时,IIS将生成一个用于加密/解密登录cookie的新密钥,从而阻止它读取现有cookie。通过设置MachineKey,重新启动后仍可读取cookie。
    ViewBag
    session
    无关,除非您将
    ViewBag
    存储在
    session
    中,这肯定不是一个好的做法。在客户端。。。只要找一个合适的答案。。。如果没有,则以新表单重新填充数据。他们哪儿也不去。。。我认为你不需要详细的回答,是吗?如果是这样的话,那么你可能需要在你的问题中提供更多的细节来说明原因,因为听起来这可能是一个特定的需要。你在会话中搅拌的是什么类型的?数据表?列表