asp.net:从会话变量转移到cookie

时间:2009-01-13 08:48:17

标签: asp.net

我的表单在共享主机上很快失去会话变量(webhost4life),我想我想用cookie替换它们。从表单到表单跟踪ID,以下内容是否合理:

if(Request.Cookies["currentForm"] == null)
   return;
projectID = new Guid(Request.Cookies["currentForm"]["selectedProjectID"]);
Response.Cookies["currentForm"]["selectedProjectID"] = Request.Cookies["currentForm"]["selectedProjectID"];

请注意,我在阅读请求cookie后,在所有表单中设置了响应cookie。这有必要吗?请求cookie是否自动复制到响应中?

我没有在Cookie上设置任何属性并以这种方式创建它们:

Response.Cookies["currentForm"]["selectedProjectID"] = someGuid.ToString();

目的是这些是临时头cookie,而不是在浏览器会话上持久存储在客户端上。我问这个,因为我不经常写网站。

9 个答案:

答案 0 :(得分:2)

在更改任何代码之前,我会调查为什么会话变量正在消失。

也许就像更改web.config中的超时设置一样简单?

以下是配置文件中的会话状态设置列表:Session Element on MSDN

=============================================== =====

哦,是的,还有另外一件事要考虑你的评论:

如果我的记忆为我服务,那么在部署到同一服务器上的多个网站会“冲突”的网络花园/农场时,我们过去遇到了一些问题。为了解决这个问题,我们明确地将cookie命名为:

<authentication mode="Forms" >
    <forms loginUrl="your-login-page.aspx" 
        cookieless="AutoDetect" 
        name=".A-NAME-WHICH-IS-UNIQUE" /> 
</authentication>

名称:可选属性。 指定用于身份验证的HTTP cookie。如果在单个服务器上运行多个应用程序,并且每个应用程序都需要唯一的cookie,则必须在每个应用程序的每个Web.config文件中配置cookie名称。

默认为“.ASPXAUTH”。 从这里link text

答案 1 :(得分:0)

在回答有关将cookie从请求复制到响应的问题时,不需要这样做。

创建cookie后,只要您需要,它就会持续存在。

如果在会话期间只需要它,则不要对Expires属性设置任何内容。在这种情况下,cookie将保存在浏览器内存中,并随每个请求提供给您的网站,直到浏览器关闭。

如果要在会话之间保持,则为Expires属性设置适当的DateTime值。在这种情况下,cookie将作为文件写在客户端计算机上,并继续提供给您的网站的每个请求,直到达到其终止日期或将其删除。

当然,请注意客户可以在浏览器中删除cookie。

答案 2 :(得分:0)

不,您不必在响应中继续重置cookie。

设置后,将继续与每个后续请求一起发送cookie。

但是我同意Dominic你首先应该确定你无法维持会议的原因。

有些原因是: -

  • 主持人正在使用不支持会话关联的网络花园或负载均衡器
  • 主机上的会话超时存在激进设置
  • 主机出现问题,并且经常回收应用程序池
  • 您的客户端设置过于严密,并拒绝所有Cookie(但这意味着您的替代解决方案也无效)
  • 应用程序逻辑可能有问题导致Session.Abandon或Session.Clear不应该。

答案 3 :(得分:0)

我同意之前的回答,你应该先调查会议的时间安排!

但关于cookies: 请求cookie是从客户端发送到服务器的cookie,响应cookie是从服务器发送的cookie,告诉客户端将它们保存在本地并将它们附加到下一个,以及所有即将到来的cookie,直到cookie过期,向服务器发出请求。

Cookie对大小有限制,因为它们的行为会对服务器和客户端之间在请求上发送的数据产生开销,当然也可以在客户端禁用。

答案 4 :(得分:0)

我怀疑您丢失会话变量的原因是您的应用程序在Web园中运行。这意味着正在运行您的应用程序的两个或多个进程。

在你的web.config中应该有sessionState标记。如果mode =“InProc”,则尝试设置mode =“StateServer”。这将导致托管应用程序的所有进程使用会话状态服务器来存储会话状态元素。还要检查前面提到的超时。

答案 5 :(得分:0)

我对cookies所做的研究表明,它们不是会话变量的理想替代品。浏览器对任何时候可以存在的cookie数量以及每个站点的数量强制执行任意限制。它们也容易被随机丢弃。

您可以启用无Cookie会话。有一些potential issues但它可能适用于您的网站。

答案 6 :(得分:0)

我是一名webhost4life客户,直到两个月前,我遇到的问题是应用程序池经常被回收 - 可能是因为主机遇到了某种问题。最后我转向VPS并且从未回头(也不是webhost4life VPS)。

答案 7 :(得分:0)

对于分享托管,最好的方法是使用SQL Session State

它有点慢但更可靠。

在那些日子里遇到了同样的问题而且我的记忆会话总是被删除,这种情况发生了,因为同一主机环境中的某个人不知道如何完成叮咬而IIS只是重置了应用程序池,甚至可以通过从托管的角度自动刷新AppPool(因此没有网站会挂起)。

自从我开始使用SQL State ... 我必须说WOW

你有总控制,甚至设置超时(内存会话由机器配置设置,无论你在代码或web配置中设置什么,你永远不会覆盖该设置)

并且获得新的,如果您更改了代码,则用户无需再次离开网站重新登录,因为他们将从现有会话继续。

设置它是fairly easy,你有很多关于如何完成这种行为的例子。

  

无论你做什么,都不要去饼干,因为它们不可靠!

答案 8 :(得分:0)

您可以考虑使用这个小库:

http://www.codeproject.com/KB/aspnet/Univar.aspx

只要cookie不可用,它就会自动切换到会话。它还具有cookie的服务器端实现,其中所有cookie都存储在服务器上,并且asp.net认证可用于识别用户。

相关问题