10

我正在尝试使用会话,但是当我需要将值返回为 null 时?

我的网站从登录开始,我将用户名放入会话中。

Session["userName"] = login.UserName;

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

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

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

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

在我将代码定向到 Home 控制器中的操作结果的地方,同一个控制器具有我的登录功能。

@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);

这些操作中的任何一个是否会导致我的会话值为空?

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

4

2 回答 2

15

如果您没有在 web.config 中手动设置会话状态,那么您应该拥有的默认值是进程中(会话存储在 Web 服务器的 RAM 中)并且超时为 20 分钟 -有关会话状态的更多信息,请参见此处

您可以使用以下内容在 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 服务器 - 尽管您也应该检查这一点!)尝试删除您的应用程序池并重新创建它。

于 2012-10-29T11:02:45.093 回答
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>
于 2018-11-16T14:34:48.447 回答