Asp.net Core中使用Session

时间:2021-08-30 05:37:03

Asp.net Core验证码登录遇到两个小问题

第一是在Asp.net Core中引用dll,以往我们引用DLL都是直接引用,在Core里这样是不行的,必须基于NuGet添加,或者基于project.json添加,然后保存VS会启动还原类库。

第二就是使用Session的问题,Core里使用Session需要添加Session类库。

 

第一步:在你的项目上基于NuGet添加:

install-package  Microsoft.AspNetCore.Session -ver 2.0

install-package Microsoft.AspNetCore.Http.Extensions -ver 2.0

 

第二步:修改startup.cs

 在startup.cs找到方法ConfigureServices(IServiceCollection services) 注入Session(这个地方是Asp.net Core pipeline):

  services.AddSession();

 接下来我们要告诉Asp.net Core使用内存存储Session数据,在Configure(IApplicationBuilder app,...)方法中添加代码:

  app.UseSession();

 

第三步 session的使用

1、在MVC Controller里使用HttpContext.Session

using Microsoft.AspNetCore.Http;

public class HomeController:Controller
{
public IActionResult Index()
{
HttpContext.Session.SetString("code","123456");
return View();
}

public IActionResult About()
{
ViewBag.Code=HttpContext.Session.GetString("code");
return View();
}
}

2、如果不是在Controller里,你可以注入IHttpContextAccessor

public class SessionAppService

{

private IHttpContextAccessor _httpContextAccessor;
private ISession Session => _httpContextAccessor.HttpContext.Session;
public SessionAppService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}

  public void Set()
     {
          _session.SetString("code","123456");
     }
    
     public void Get()
    {
         string code = _session.GetString("code");
     }

}

 

3、Isession的扩展 存储复杂对象

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 value = session.GetString(key);

        return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
    }
}
使用范例
var myComplexObject = new MyClass();
HttpContext.Session.SetObjectAsJson("Test", myComplexObject);


var myComplexObject = HttpContext.Session.GetObjectFromJson<MyClass>("Test");