2016-06-13 82 views
4

在Asp.Net会议的早期版本可以在任何页面访问喜欢用如何通过静态变量访问ASP.NET Core中的会话?

System.Web.HttpContext.Current.Session["key"] 

在Asp.Net的核心,如何通过控制器进行调用不同的类来访问会话,而没有经过会话属性静态变量在所有类

+1

阅读文档如何?它在ASP.NET Core的这个阶段有很好的描述:https://docs.asp.net/en/latest/fundamentals/app-state.html#installing-and-configuring-session – Tseng

+0

在我看到的所有示例中该网站,我只能看到“HttpContext objContext”对象作为参数传递给方法/委托,而会话作为objContext.Session访问。我认为就像早些时候的Asp.Net一样,像HttpContext.Current.Session一样,这样可以避免传递额外的参数 – Navaneeth

+2

在控制器内部可以访问HttpContext(如果控制器来自'Controller'基类)否则你必须注入'IHttpContextAccessor' – Tseng

回答

5

修订办法16年1月17日说明修正错误

注入的 IHttpContextAccessor实例

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

如何访问通过控制器叫法不同堂课,而未通过会话属性作为附加参数中的所有类

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

在控制器,你可以通过this.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框架一起发布,但未默认安装。所以我们需要用一行代码“安装”它。该行云在Startup.cs文件的ConfigureServices方法,可以在任何地方的方法位于:

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

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

AppHttpContext.Services = app.ApplicationServices; 

现在,任何由Controller调用,即使通过异步等待模式的方法,可以通过AppHttpContext.Current

访问当前HttpContext所以,如果我们使用在Microsoft.AspNetCore.Http命名空间Session扩展方法,我们可以节省名为“伯爵”到会话的int可以做这样的:

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

和检索的int从会议名为“伯爵”可以做这样的:

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

享受。

+1

@ Ron C很好的答案。向其他人发出通知,替换'await next();'用'await next.Invoke();'替换** Core 1.0 ** –

+0

@shittu感谢您的更新。 –

3

首先的构造函数的附加参数,你必须包

"Microsoft.AspNetCore.Session": "1.0.0" 

添加为project.json的依赖。在Startup.ConfigureServices你要添加的服务

services.AddSession(); 

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

app.UseSession(); 

现在你可以在你的控制器使用它(如果派生自控制器)。你可以存储

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