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");