2012-10-29 48 views
5

我想使用一个会话,但是当我需要返回它的空值?会话[]保留数据多久?

我的网站从一个登录名开始,我把用户名放到一个Session中。

Session["userName"] = login.UserName; 

然后网站被重定向到一个新的页面。

return RedirectToAction("Choice", new { token = token }); 

后女巫我使用链接移动到我的下一页。

@Html.ActionLink("Download", "Download", new {token = Model.Token}) 

在哪里我直接把我的代码的行动结果的首页控制器相同的控制器我有我的登录功能。

@Html.ActionLink("Download", "DownloadFile", new { fileid = item.Key, token = Model.Token, platform = "windows", filename = item.Value }, new {@class = "DownloadLink" }) 

我在哪里尝试再次调用我的会话值。

formMobiApi.GetFile(token, fileid, platform, filename, Session["userName"].ToString(), tasks, taskId, spreadSheetStatus); 

这些操作中的任何一个是否在执行任何操作以使我的会话值为空?

我可以使用这样的会话吗?

+1

您的会话如何处理?他们是基于cookie还是inproc?您的web.config中的会话超时值是什么? –

+0

我无法在我的web.Config中找到任何会话超时,并且我不确定我的会话是基于cookie还是inproc,我将如何检查? – Pomster

回答

9

如果不手动设置您的会话状态在web.config中,那么你应该在进程(会话存储在Web服务器的RAM)的默认和超时20分钟 - see here for more information on session states

您可以手动与下面的设置你的状态在你的web.config文件:

<configuration> 
    <system.web> 
     <sessionState mode="InProc" timeout="20"></sessionState> 
    </system.web> 
</configuration> 

现在,在您的实际问题。我不完全确定你的会话为什么不会持续下去,而且我也无法找到答案,因为我没有要调试的代码副本。在猜测中,我会说你的HttpContext与初始化会话的时间不同,当你请求它的时候,所以你的上下文关键字是不同的。尝试改变

Session["userName"].ToString(); 

HttpContext.Current.Session["userName"].ToString(); 

这乍看上去有点古怪,因为你切实做好同样的事情。区别在于,如果当前对象无法访问HttpContext,则需要明确定义要从中读取的上下文。

再看看你提供的代码,没有什么不寻常的 - 这应该是有效的。我真的开始相信这是一个环境/配置问题。如果您使用表单身份验证然后检查您的web.config文件中的超时。另外,如果您在IIS中托管(而不是Visual Studio的Web服务器 - 尽管您也应该检查它!),请尝试删除您的应用程序池并重新创建它。