Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 会话数据在请求之间不存在?_.net_Asp.net Mvc 4_Session Variables - Fatal编程技术网

.net 会话数据在请求之间不存在?

.net 会话数据在请求之间不存在?,.net,asp.net-mvc-4,session-variables,.net,Asp.net Mvc 4,Session Variables,在我的授权过程中,我需要将一些数据设置到会话中,以便它可以随网页发出的每个请求一起移动。一旦在我的AuthorizationAttribute.AuthorizationCore()中批准了授权,我就会调用我们的服务来检索每个请求所需的数据,并通过httpContext.session[“MyInfoObject”]=MyInfoObject将其填充到会话中,然后返回true 会话cookie已设置,下一个请求显示用户现在已通过身份验证。但是,当我试图检索以前通过var myInfoObject

在我的授权过程中,我需要将一些数据设置到会话中,以便它可以随网页发出的每个请求一起移动。一旦在我的AuthorizationAttribute.AuthorizationCore()中批准了授权,我就会调用我们的服务来检索每个请求所需的数据,并通过
httpContext.session[“MyInfoObject”]=MyInfoObject
将其填充到会话中,然后返回true

会话cookie已设置,下一个请求显示用户现在已通过身份验证。但是,当我试图检索以前通过
var myInfoObject=requestContext.HttpContext.Session[“myInfoObject”]存储为myInfoObject的数据时整个会话值集合为空。我观察了Session对象,可以看到Session对象已填充,SessionID与浏览器中Session cookie中的相同,但值集合为空。什么也没救

有什么想法吗

更新
我正在检查控制器基类中的会话值。我为我的控制器创建了一个自定义基类,在Initialize()覆盖中,我首先调用base.Initialize(),然后开始处理会话。在此阶段,会话值为空。但是,如果我在派生控制器上的操作内部放置断点,我的值就在那里。我想我在管道执行的方式上遗漏了一些东西。任何信息都会有帮助。

我通常通过重写OnActionExecuting方法来访问基本控制器中的会话变量。我认为在这个过程中初始化太早了。参见

我能够解决这个问题并发现了一些要点。它真正归结为管道每个阶段会话对象的状态。它在任何时候都不为空
;问题是,根据我在执行链中的位置,我之前填充到其中的所有值都不可用。我没有找到任何关于生命周期的官方文件,但我发现了一些东西:

  • 在AuthProvider中,可以向会话值集合中添加,但不能从中读取未在同一方法中添加的任何内容。我想这是因为这个疗程还没有完全补充水分。会话对象图顶部的会话ID和其他信息等内容已完全填充并可用
  • 在Authorization属性中,这是相同的交易。您可以添加到课程中,但您无法读取任何内容,因为它尚未完全水合。我本想在这里检查代币,但那是不可能的。因此,我只是检查用户是否有一个ASP身份验证令牌,它告诉我我还没有终止他们的会话。很好。我将在后面的步骤中检查该会话中加载的令牌。将来,当角色被添加进来时,我将尝试在这里处理这个问题
  • 在控制器的OnActionExecuting覆盖中(在我的例子中是控制器基),您可以在整个会话中获得。不过,在这里检查代币是愚蠢的。相反,我假设这一点已经设置了所有内容,因此我使用它将用户配置文件对象从会话中拉出,并将其存储到属性中,从而使派生控制器可以访问它。这将在下一个项目符号之后执行
  • ActionFilterAttribute也将有一个完全水合的会话对象。所以我创建了一个名为TokenManagementFilterAttribute的。在这里,我将令牌从会话中取出,进行范围检查和验证,并根据需要刷新和更新概要文件对象。如果任何操作失败,我将controller.Response设置为重定向回登录页面并终止会话

我的第一个想法是尝试保存一个简单的字符串而不是一个复杂的对象,然后看看这是否有效。如果是,请检查对象是否可序列化。为True,但授权必须成功才能执行此步骤。我最终不得不直接在控制器中执行授权逻辑