ASP.NET session 상태를 web application 에서 asp.net 페이지를 사용하여 사용자별 정보를 설정 및 가져올 수 있다.
Session 값은 사이트에서 사용자별로 session 의 활성 시간동안 저장되어진다. 대부분의 경우, 이는 서버 메모리에 저장된다.
또한 sql server 또는 state server 에 세션의 값을 저장할 수 있도록 환경설정도 가능하다. asp.net mvc 에서 HttpContext 를 사용하여 세션 변수에 접근하여 생성할 수 있다.
asp.net 5 에서는 asp.net team 이 Session 관리에 대한 미들웨어를 개발했다.
이제 asp.net 5 Session Middleware 사용하는 방법을 알아보자.
1. 먼저 project.json 파일에 Microsoft.AspNet.Session”: “1.0.0-*” 참조를 기술한다.
2. Startup.cs 파일에 ConfigureServices() 메소드를 session 미들웨어에 아래와 같이 services.AddSession(); 추가한다.
public void ConfigureServices(IServiceCollection services)
{
services.AddCaching();
services.AddSession();
services.AddMvc();
}
3. configure() 메소드에서 app.UseSession() 확장 메소드를 추가한다. 유지 시간은 30분으로 하였다.
public void Configure(IApplicationBuilder app)
{
app.UseSession(configure: s => s.IdleTimeout = System.TimeSpan.FromMinutes(30));
app.UseErrorPage();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute("default", "//");
});
}
4. Context object 에 session 을 관리할 수 있도록 하는 코드를 기술한다.
여기서 session 값을 설정하는 3가지 방법이 존재한다. SetInt, SetString 그리고 Set 이다. 이는 byte array 를 파라미터로 가져오는 방법을 취한다.
그리고 session 값을 가져오기 위해 3개의 메소드도 존재한다. GetInt, GetString, 그리고 Get 이 있따. 이는 key 에 대한 byte 배열을 반환한다.
만악에 session 에서 custom type 을 저장하길 원한다면, Get / Set 메소드를 사용해야 한다. 그리고 serialization 그리고 de-serialization 로직을 구현할 필요가 있다.
//Setting the session values
Context.Session.SetString("Name","shimjaewoon");
Context.Session.SetString("Address", http://aspdotnet.tistory.com);
//Getting the session values
Name = Context.Session.GetString("Name"),
Address = Context.Session.GetString("Address")
메모리 내 캐시를 사용하는 경우에도, 분산된 캐시 시나리오를 사용하려면 모든 세션 데이터를 직렬화해야 합니다. 문자열 및 정수 직렬 변환기는ISession의 확장 메서드가 제공합니다. 복합 형식은 JSON과 같은 다른 메커니즘을 사용하여 사용자가 직렬화해야 합니다.
Product.cs 라는 Model 클래스를 생성합니다.
namespace LearnASPNETCoreMVC5.Models
{
public class Product
{
public string Id { get; set; }
public string Name { get; set; }
public double Price { get; set; }
}
}
Helpers 라는 폴더를 생성하고 SessionHelper.cs 클래스를 만듭니다. 세션 값을 할당할때는 Newtonsoft.Json 을 활용하여 직렬화(SerializeObject)를 하며, 가져올 때는 DeserializeObject 를 하였습니다.
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
namespace LearnASPNETCoreMVC5.Helpers
{
public static class SessionHelper
{
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);
}
}
}
문자열은 SetString(), 숫자는 SetInt32() 그리고 object 는 SessionHelper 클래스를 통해 할당하는 코드 예제 입니다.
using LearnASPNETCoreMVC5.Helpers;
using LearnASPNETCoreMVC5.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace LearnASPNETCoreMVC5.Controllers
{
[Route("demo")]
public class DemoController : Controller
{
[Route("")]
[Route("index")]
[Route("~/")]
public IActionResult Index()
{
HttpContext.Session.SetInt32("age", 20);
HttpContext.Session.SetString("username", "abc");
Product product = new Product
{
Id = "p01",
Name = "Name 1",
Price = 5
};
SessionHelper.SetObjectAsJson(HttpContext.Session, "product", product);
List<Product> products = new List<Product>() {
new Product {
Id = "p01",
Name = "Name 1",
Price = 5
},
new Product {
Id = "p02",
Name = "Name 2",
Price = 9
},
new Product {
Id = "p03",
Name = "Name 3",
Price = 2
}
};
SessionHelper.SetObjectAsJson(HttpContext.Session, "products", products);
return View("Index");
}
}
}
할당된 session 을 GetInt32(), GetString() 및 Helper Class 를 통한 object 를 view page 에서 session 가져와서 출력하는 부분을 확인해 보겠습니다.