如何通过静态变量访问ASP.NET Core中的Session?

时间:2016-06-13 09:10:36

标签: session asp.net-core asp.net-core-mvc

在早期版本的Asp.Net会话中,可以使用

在任何页面中访问,如静态变量
System.Web.HttpContext.Current.Session["key"]

在Asp.Net Core中,如何访问通过控制器调用的不同类中的会话,而不将会话属性作为所有类的构造函数中的附加参数传递

3 个答案:

答案 0 :(得分:14)

修订方法1/17/17修复错误

首先,我假设您已将ASP.NET Core应用程序配置为使用会话状态。如果没有,请参阅@ slfan的回答How to access the Session in ASP.NET Core via static variable?

  

如何访问通过控制器调用的不同类中的会话,而不将会话属性作为所有类的构造函数中的附加参数传递

Asp.Net Core是围绕依赖注入设计的,一般来说,设计人员并没有提供对上下文信息的静态访问。更具体地说,没有相当于System.Web.HttpContext.Current

在控制器中,您可以通过this.HttpContext.Session访问会话变量,但是您明确询问了如何从控制器调用的方法访问会话,而将会话属性作为参数传递

因此,要做到这一点,我们需要设置自己的静态类来提供对会话的访问,我们需要一些代码来在启动时初始化该类。因为一个人可能想要静态访问整个HttpContext对象,而不仅仅是Session我采用了这种方法。

首先我们需要静态类:

using Microsoft.AspNetCore.Http; 
using System;
using System.Threading;

namespace App.Web {

    public static class AppHttpContext {
        static IServiceProvider services = null;

        /// <summary>
        /// Provides static access to the framework's services provider
        /// </summary>
        public static IServiceProvider Services {
            get { return services; }
            set {
                if(services != null) {
                    throw new Exception("Can't set once a value has already been set.");
                }
                services = value;
            }
        }

        /// <summary>
        /// Provides static access to the current HttpContext
        /// </summary>
        public static HttpContext Current {
            get {
                IHttpContextAccessor httpContextAccessor = services.GetService(typeof(IHttpContextAccessor)) as IHttpContextAccessor;
                return httpContextAccessor?.HttpContext;
            }
        } 

    }
}

接下来,我们需要向DI容器添加一个服务,该服务可以提供对当前HttpContext的访问。此服务附带Core MVC框架,但默认情况下未安装。所以我们需要安装&#34;它只需一行代码。这一行放在Startup.cs文件的ConfigureServices方法中,可以位于该方法的任何位置:

//Add service for accessing current HttpContext
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();    

接下来,我们需要设置静态类,以便它可以访问DI容器以获取我们刚刚安装的服务。下面的代码位于Startup.cs文件的Configure方法中。该行可以位于该方法的任何位置:

AppHttpContext.Services = app.ApplicationServices; 

现在Controller调用的任何方法,即使是通过异步等待模式,都可以通过HttpContext

访问当前AppHttpContext.Current

因此,如果我们在Session命名空间中使用Microsoft.AspNetCore.Http扩展方法,我们可以保存int名为&#34; Count&#34;会议可以像这样完成:

AppHttpContext.Current.Session.SetInt32("Count", count);

检索int名为&#34; Count&#34;来自会议可以这样做:

int count count = AppHttpContext.Current.Session.GetInt32("Count");

享受。

答案 1 :(得分:3)

首先,您必须添加包

"Microsoft.AspNetCore.Session": "1.0.0"

作为project.json中的依赖项。在Startup.ConfigureServices中,您必须添加服务

services.AddSession();

在方法配置中你必须使用它(重要:在UseMvc之前调用)

app.UseSession();

现在您可以在控制器中使用它(如果从Controller派生)。你可以存储

var data = new byte[] { 1, 2, 3, 4 };
HttpContext.Session.Set("key", data); // store byte array
HttpContext.Session.TryGetValue("key", out data); // read from session

导入命名空间Microsoft.AspNetCore.Http时,您也可以使用SetStringSetInt32

using Microsoft.AspNetCore.Http;

HttpContext.Session.SetString("test", "data as string"); // store string
HttpContext.Session.SetInt32("number", 4711); // store int

int ? number = HttpContext.Session.GetInt32("number");

在控制器外部,您无权访问HttpContext,但您可以注入answer

中描述的IHttpContextAccessor实例

答案 2 :(得分:1)

如果要从Session中存储和检索复杂的对象,可以改用以下扩展名:

public static class SessionExtensions
{
    public static void SetObjectAsJson(this ISession session, string key, object value)
    {
        session.SetString(key, JsonConvert.SerializeObject(value));
    }

    public static T GetObjectFromJson<T>(this ISession session, string key)
    {
        var data = session.GetString(key);  
        if (data == null)  
        {  
            return default(T);  
        }  
        return JsonConvert.DeserializeObject<T>(data);
    }
}

然后您将这样称呼他们:

User user = new User();  
user.Name = "Jignesh Trivedi";  
user.Percentage = 75.45;             

HttpContext.Session.SetComplexData("UserData", user); 

或者,

ViewBag.data = HttpContext.Session.GetComplexData<User>("UserData");  

有关详细信息,请参见https://www.c-sharpcorner.com/article/session-state-in-asp-net-core/