재우니의 블로그

ASP.NET Core 5 의 SESSION Middleware 사용 및 가져오는 방법

 

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과 같은 다른 메커니즘을 사용하여 사용자가 직렬화해야 합니다.

 

ISession 인터페이스 (Microsoft.AspNetCore.Http)

사용자가 웹 응용 프로그램을 탐색 하는 동안 사용자 데이터를 저장 합니다. 세션 상태는 응용 프로그램에서 유지 관리 하는 저장소를 사용 하 여 클라이언트의 요청 간에 데이터를 유지 합니다

docs.microsoft.com

 

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 가져와서 출력하는 부분을 확인해 보겠습니다.

 

@using Microsoft.AspNetCore.Http;
@using LearnASPNETCoreMVC5.Helpers;
@using LearnASPNETCoreMVC5.Models;

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>

    <h3>Session Page</h3>
    Age: @Context.Session.GetInt32("age")
    <br />
    Username: @Context.Session.GetString("username")

    <h3>Product Info</h3>
    @{
        Product product = SessionHelper.GetObjectFromJson<Product>(Context.Session, "product");
    }
    Id: @product.Id
    <br />
    Name: @product.Name
    <br />
    Price: @product.Price

    <h3>Product List</h3>
    @{
        List<Product> products = SessionHelper.GetObjectFromJson<List<Product>>(Context.Session, "products");
    }
    @foreach (var p in products)
    {
        <div>
            Id: @p.Id
            <br />
            Name: @p.Name
            <br />
            Price: @p.Price
            <br />
            ==================
            <br />
        </div>
    }

</body>
</html>

 

결과

 

 

 

참고 사이트

 

https://learningprogramming.net/net/asp-net-core-mvc-5/use-session-in-asp-net-core-mvc-5/

 

Use Session in ASP.NET Core MVC 5 - Learn Programming with Real Apps

Create ASP.NET Core MVC 5 Project On the Visual Studio, select Create a new project from Get Started Select ASP.NET Core Web Application Input Project Name and select Location for new project Select ASP.NET Core 5.0 Version and select ASP.NET Core Empty Te

learningprogramming.net

 

https://docs.microsoft.com/ko-kr/aspnet/core/fundamentals/app-state?view=aspnetcore-5.0 

 

ASP.NET Core의 세션

요청 간에 세션을 유지하는 방법을 알아봅니다.

docs.microsoft.com