C# 无法访问Asp.Net核心项目中帮助器类内的会话对象

C# 无法访问Asp.Net核心项目中帮助器类内的会话对象,c#,asp.net-core-2.0,C#,Asp.net Core 2.0,我正在尝试访问ASP.NET Core 2.1项目中帮助器类中的HttpContext.Session对象 当我尝试访问HttpContext.Session时,我得到以下错误 CS0120非静态字段、方法或属性“HttpContext.Session”需要对象引用 使用.NET4.xASP.NET,可以通过“HttpContext.Current.Session”轻松访问它 这是我的班级: public class MySession { public void Foo()

我正在尝试访问ASP.NET Core 2.1项目中帮助器类中的HttpContext.Session对象

当我尝试访问HttpContext.Session时,我得到以下错误

CS0120非静态字段、方法或属性“HttpContext.Session”需要对象引用

使用.NET4.xASP.NET,可以通过“HttpContext.Current.Session”轻松访问它

这是我的班级:

 public class MySession
 {

    public void Foo()
    {
        HttpContext.Session.SetString("Name", "The Doctor"); // will not work
        HttpContext.Session.SetInt32("Age", 773);  // will not work

    }
 }
这是我的Startup.cs:

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDistributedMemoryCache();

            services.AddSession(options =>
            {
                // Set a short timeout for easy testing.
                options.IdleTimeout = System.TimeSpan.FromMinutes(30);
                options.Cookie.HttpOnly = true;
            });

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            // In production, the Angular files will be served from this directory
            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/dist";
            });

            services.Configure<ServiceSettings>(Configuration.GetSection("ServiceSettings"));
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            app.UseSession();
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseSpaStaticFiles();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller}/{action=Index}/{id?}");
            });

            app.UseSpa(spa =>
            {
                // To learn more about options for serving an Angular SPA from ASP.NET Core,
                // see https://go.microsoft.com/fwlink/?linkid=864501

                spa.Options.SourcePath = "ClientApp";

                if (env.IsDevelopment())
                {
                    spa.UseAngularCliServer(npmScript: "start");
                }
            });
        }
    }
公共类启动
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
AddDistributedMemoryCache();
services.AddSession(选项=>
{
//设置一个较短的超时时间以便于测试。
options.IdleTimeout=System.TimeSpan.FromMinutes(30);
options.Cookie.HttpOnly=true;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
//在生产中,角度文件将从此目录中提供
services.AddSpaStaticFiles(配置=>
{
configuration.RootPath=“ClientApp/dist”;
});
services.Configure(Configuration.GetSection(“ServiceSettings”);
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseExceptionHandler(“/Error”);
app.UseHsts();
}
app.UseSession();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseMvc(路由=>
{
routes.MapRoute(
名称:“默认”,
模板:“{controller}/{action=Index}/{id?}”);
});
app.UseSpa(spa=>
{
//要从ASP.NET Core了解更多有关提供角度SPA的选项,
//看https://go.microsoft.com/fwlink/?linkid=864501
spa.Options.SourcePath=“ClientApp”;
if(env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript:“启动”);
}
});
}
}

我是否需要向MySession类中注入一些内容?

您仍然可以通过
HttpContext
访问
会话。您必须通过
IHttpContextAccessor
访问会话,顾名思义,它将允许访问控制器外部的
HttpContext
,以及将其作为本地成员的其他框架类

首先,您需要将访问器添加到DI容器中

services.AddHttpContextAccessor();

从那里,您需要将它注入到所需的类中,并访问所需的成员

public class MySession {
    IHttpContextAccessor accessor;

    public MySession(IHttpContextAccessor accessor) {
        this.accessor = accessor;
    }

    public void Foo() {
        var httpContext = accessor.HttpContext;
        httpContext.Session.SetString("Name", "The Doctor");
        httpContext.Session.SetInt32("Age", 773);
    }
}

我们还需要初始化会话对象

    private ISession _session => _httpContextAccessor.HttpContext.Session;
完整的解决方案如下。以防有人(像我一样)无法使用上述代码

Public class SomeOtherClass {

private readonly IHttpContextAccessor _httpContextAccessor;
private ISession _session => _httpContextAccessor.HttpContext.Session;

public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
{
    _httpContextAccessor = httpContextAccessor;
}

public void TestSet()
{
    _session.SetString("Test", "Ben Rules!");
}

public void TestGet()
{
    var message = _session.GetString("Test");
} }

从添加httpcontext访问器中获取的代码,以便您可以访问会话。我如何在controller或razor page@Nkosi中使用此会话的可能副本