我正在尝试使用会话,但是当我需要将值返回null时?
我的网站以登录开始,我将用户名放入会话。
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);
是否有任何操作可以使我的会话值为空?
我可以使用这样的会话吗?
答案 0 :(得分: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服务器 - 尽管您也应该检查它!)尝试删除您的应用程序池并重新创建它。
答案 1 :(得分:0)
您的会话变量已正确设置,并且已被正确调用以获取该值。
要调试的唯一一件事就是实际查看 login.UserName 是否具有实际值。因为您可能只是将会话变量设置为null( login.UserName )。
如果这不起作用,还尝试将其添加到您的web.config文件中。
<sessionState mode="InProc" timeout="20" customProvider="DefaultSessionProvider">
<providers>
<add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
</providers>
</sessionState>