재우니의 블로그

 

 
 
 
ASP.NET Core 에서 Sql Server Session State 를 설정하는 방법
 
 
소개
 
 
세션 은 ASP.NET core 의 기능으로 사용자 데이터를 저장 / 저장할 수 있습니다. 세션은 서버의 dictionary 에 데이터를 저장하고 SessionId는 키로 사용됩니다. SessionId는 클라이언트의 쿠키에 저장됩니다. SessionId 쿠키는 모든 요청과 함께 전송됩니다. SessionId 쿠키는 브라우저에 따라 다르며 브라우저간에 공유 할 수 없습니다. SessionId 쿠키에 대해 지정된 시간 제한이 없으며 브라우저 세션이 종료 될 때 삭제됩니다. 

세션에는 두 가지 유형이 있습니다 : InProc 또는 In-memory 및 OutProc 또는 분산 세션(Distributed session)
세션이  in-memory 에 있고 응용 프로그램이 Web-Farm 환경에서 호스팅되는 경우, 고정 세션을 사용하여 각 세션을 특정 서버에 연결 해야합니다. 
반면 OutProc 세션은 이러한 세션을 필요로 하지 않으며 ,이는 응용 프로그램에서 OutProc 세션을 사용하는 가장 좋은 방법입니다.

 이전 기사에서는, InProc 와 In-Memory 세션에 대해 말씀 드렸습니다. 
 
이번 이 기사에서는 ASP.NET Core 의 OutProc - SQL Server 세션 상태에 대해 학습합니다. 
 
 
 
SQL Server session state 구성방법
 
SQL Server Session state 에서 이전 버전의 ASP.NET에서는 SQL Server에서 세션 저장소를 관리하기 위해 여러 테이블과 저장 프로 시저가 필요하며, "aspnet_regsql"명령 또는 도구를 사용하여이 구성을 구성 할 수 있습니다. 
 
ASP.NET Core 에서는 하나의 테이블만 필요합니다. 이 스토리지 테이블을 생성하는 방법은 여러 가지가 있습니다. 
첫 번째는 "Microsoft.Extensions.Caching.SqlConfig.Tools"도구를 사용하는 것입니다. 이 도구를 설치하려면 project.json에 추가하고 "dotnet restore" 명령을 수행해야합니다. 
 
 
Project.json
 
  1.  "tools": {  
  2.       "Microsoft.Extensions.Caching.SqlConfig.Tools""1.0.0-preview2-final"   
  3. }  
이 도구가 프로젝트에 설치되면 필요한 테이블과 색인을 생성하는 "sql-cache"명령을 실행할 수 있습니다. 명령의 형식은 다음과 같습니다. 
 
  1. dotnet sql-cache create <connection string>  <schema>  <table name>  

여기서는 SQL Express Edition을 사용하고 있으며 command 에 테이블과 색인을 생성합니다.

 
  1. dotnet sql-cache create "Data Source=.\SQLExpress;Initial Catalog=Test;Integrated Security=True;" "dbo" "SQLSessions"  
 
 
 
 
또는이 테이블과 색인을 수동으로 만들 수 있습니다. 이 스크립트는 테이블과 색인을 생성하기 위해 아래에 주어집니다
 
  1. CREATE TABLE [dbo].[SQLSessions](  
  2.     [Id] [nvarchar](449) NOT NULL,  
  3.     [Value] [varbinary](maxNOT NULL,  
  4.     [ExpiresAtTime] [datetimeoffset](7) NOT NULL,  
  5.     [SlidingExpirationInSeconds] [bigintNULL,  
  6.     [AbsoluteExpiration] [datetimeoffset](7) NULL,  
  7.  CONSTRAINT [pk_Id] PRIMARY KEY CLUSTERED   
  8. (  
  9.     [Id] ASC  
  10. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ONON [PRIMARY]  
  11. ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]  
  12.   
  13. GO  
  14. CREATE NONCLUSTERED INDEX [Index_ExpiresAtTime] ON [dbo].[SQLSessions]  
  15. (  
  16.     [ExpiresAtTime] ASC  
  17. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)  
  18. GO  
SQL Server session state 는 내부적으로 Memory Cache 를 사용하므로 SQL Server Session 을 사용할 수 있습니다. "Microsoft. AspNet.Session"과 함께 "Microsoft.Extensions.Caching.SqlServer" 종속성을 project.json 파일에 추가해야 합니다.
 
project.json
 
  1. {  
  2.   "version""1.0.0-*",  
  3.   "buildOptions": {  
  4.     "preserveCompilationContext"true,  
  5.     "debugType""portable",  
  6.     "emitEntryPoint"true  
  7.   },  
  8.   "tools": {  
  9.       "Microsoft.Extensions.Caching.SqlConfig.Tools""1.0.0-preview2-final"   
  10.   },  
  11.   "dependencies": {},  
  12.   "frameworks": {  
  13.     "netcoreapp1.0": {  
  14.       "dependencies": {  
  15.         "Microsoft.NETCore.App": {  
  16.           "type""platform",  
  17.           "version""1.0.1"  
  18.         },  
  19.     "Microsoft.AspNetCore.Server.Kestrel""1.0.0",  
  20.     "Microsoft.AspNetCore.Mvc""1.0.0",  
  21.     "Microsoft.AspNetCore.Session" : "1.0.0",  
  22.     "Microsoft.Extensions.Caching.SqlServer" : "1.0.0",  
  23.     "Microsoft.Extensions.Configuration.Json" : "1.0.0"  
  24.       },  
  25.       "imports""dnxcore50"  
  26.     }  
  27.   }  
  28. }  
appSetting.json 파일에 연결 문자열을 추가하거나 startup class 의 ConfigureServices 메소드에 직접 연결 문자열을 넣을 수 있습니다. 
다음은 startup class 의 ConfigureServices 및 Configure 메소드를 기술합니다. 
 
Startup.cs
 
  1. using System;  
  2. using Microsoft.AspNetCore.Builder;  
  3. using Microsoft.AspNetCore.Http;  
  4. using Microsoft.Extensions.DependencyInjection;  
  5.   
  6. namespace WebApplication {  
  7.     public class Startup{  
  8.         public void ConfigureServices(IServiceCollection services)  
  9.         {  
  10.             services.AddDistributedSqlServerCache(options =>  
  11.             {  
  12.                 options.ConnectionString = @"Data Source=.\SQLExpress;Initial Catalog=Test;Integrated Security=True;";  
  13.                 options.SchemaName = "dbo";  
  14.                 options.TableName = "SQLSessions";  
  15.             });  
  16.               
  17.             services.AddSession(options => {   
  18.                 options.CookieName = "Test.Session";  
  19.                 options.IdleTimeout = TimeSpan.FromMinutes(60);   
  20.             });  
  21.               
  22.               
  23.             services.AddMvc();  
  24.         }  
  25.         public void Configure(IApplicationBuilder app){  
  26.             app.UseSession();  
  27.             app.UseMvc();              
  28.             app.Run(context => {  
  29.                 return context.Response.WriteAsync("Hello Readers!");  
  30.             });   
  31.         }  
  32.     }  
  33. }  

Example

아래 

예제

 에서는 첫 번째 요청에서 세션에 name 을 설정하고 다른 요청에서 세션 값을 검색했습니다. 
 
  1. using Microsoft.AspNetCore.Http;  
  2. using Microsoft.AspNetCore.Mvc;  
  3. using Microsoft.Extensions.Caching.Distributed;  
  4.   
  5. public class HomeController : Controller  
  6. {  
  7.     [Route("home/index")]  
  8.     public IActionResult Index()  
  9.     {  
  10.         HttpContext.Session.SetString("name","Jignesh Trivedi");  
  11.         return View();  
  12.     }  
  13.     [Route("home/GetSessionData")]  
  14.     public IActionResult GetSessionData()  
  15.     {  
  16.         ViewBag.data = HttpContext.Session.GetString("name");  
  17.         return View();  
  18.     }  
  19. }  
Output

 
ASP.NET Core 에서 SQL 서버 상태를 사용하여 세션 확장 메서드를 만들고 사용할 수 있으며 복잡한 개체를 세션에 저장할 수도 있습니다.
 
요약
 
이 기사에서는 ASP.NET Core MVC 응용 프로그램에서 SQL Server를 세션 상태 저장 메커니즘으로 사용하는 데 필요한 단계를 설명했습니다. 
SQL Server session state 의 사용법은 기존 ASP.NET 응용 프로그램과 약간 다릅니다.