ㆍ기본 쿠키작성하기 (인증 서비스를 이용하지 x, startup.cs 서비스 및 middleware x) Controller 작성시 Response , Request 객체를 기본적으로 지원하므로 별도의 서비스 및 미들웨어 추가 없이 쿠키 작성가능 (컨트롤러 작성시 기본상속되는 Controllers 클래스가 상속받는 ControllerBase 의 Response , Reqeust 메서드 지원함
ㆍ기본 세션작성(인증 서비스를 이용하지 x) Session 의경우 서비스 및 미들웨어를 추가해줘야한다. (services.addSession() + app.UseSession()) ① services.addSession() 추가 : startup.cs 의 ConfigureServices() 서비스 컨테이터에 services.addSession() (또는 옵션추가) 추가 ② app.UseSession() 추가 : Configure() 미들웨어 파이프라인에 app.UseSession(); 추가
– 세션사용 : HttpContext.Session.GetString(KEY) / HttpContext.Session.GetInt32(KEY) 예) var userId = HttpContext.Session.SetString(“UserId”, “pluginn”) int userDeptNo = HttpContext.Session.SetInt32(“UserDeptNo”);
public class MyPageController: Controllers { public MyPage() { // 컨트롤러 생성자에서 Response / Request 객체가 생성되기 전이므로 // Response , Request 객체를 사용할수 없으므로 쿠키생성 및 읽기 오류 NullReferenceException }
public void MakeCookie() { HttpContext.Session.SetString(“UserId” , “Pluginn”); HttpContext.Session.SetInt32(“UserDeptNo”, 88); string getUserId =HttpContext.Session.GetString(“UserId”); int getUserDeptNo = HttpContext.Session.GetInt32(“UserDeptNo”); } }
ㆍ외부 컴포넌트(DLL) 에서 HttpContext 사용하기
ㆍMVC 또는 웹 페이지의 경우, 작성되는 웹관련 페이지들은 상속받는 클래스로부터 HttpContext 객체 속성을 사용할수 있기때문에 Response , Request 를 포함 현재 호출되는 Context 의 여러가지 객체들을 사용할 수가 있다.
하지만 외부 모듈(재사용성, 편의성)로 분리된 DLL 의 경우 특정한 프로젝트에 종속되어 만들어 지지않기 때문에, 웹에서 사용될 DLL 의 경우 호출되는 웹의 context 를 DLL 에서 사용할수 있게 해줘야 외부DLL 에서도 본인이 호출되어지는 웹페이지에서의 쿠키,세션이나 기타 Response , Request 에 대한정보를 독립적으로 다뤄 처리가 가능하다.
기존에 HttpContext.Current 를 대체해 asp.net Core 에서 사용하는 HttpContextAccessor (예전에는 HttpContext.Current) 는 ASP.NET Core의 HttpContextAccessor는 비동기 모델을 위해 새롭게 나온 타입 이다.
① 외부 DLL 도 HttpContext 를 사용할수 있는 , 웹 관련 클래스를 상속시키는방법 ② 외부 DLL 객체 참조시 현재 Context 를 파라미터로 전달하는 방법 ③ 외부 DLL 생성자에게 의존성주입을통해 Context 를 전달하는 방법
① 외부 DLL – HttpContext 를 사용할수 있는 , 웹 관련(HttpContextAccessor) 클래스를 상속시키는방법
※ DLL 모듈 (HttpContextAccessor , Controller , ControllerBase 등 상속) public Class MyUtil : HttpContextAccessor { pubilc string getCurrentUser() { return string HttpContext.Request.Cookies[“UserID”]; } }
※ DLL 참조하는 웹 프로젝트 메서드 public IActionResult GetInfoFromDLL() { Class.MyClass myclass = new Class.MyClass(); var info = myclass.getCurrentUser(); ViewBag.inherit = info; return View(); }
② 외부 DLL 객체 참조시 현재 Context 를 파라미터로 전달하는 방법
※ DLL 모듈 public Class MyUtil { pubilc string getCurrentUser(HttpContextcontext) { return string context.Request.Cookies[“UserID”]; } }
※ DLL 참조하는 웹 프로젝트 메서드 public IActionResult GetInfoFromDLL()
{ Class.MyClass myclass = new Class.MyClass(this.HttpContext); var info = myclass.getCurrentUser(); ViewBag.inherit = info; return View(); }
③ 외부 DLL 생성자에게 의존성주입을통해 Context 를 전달하는 방법
– StartUp.cs 에 서비스 컨테이너에서 서비스 등록 public void ConfigureServices(IServiceCollection services) { ★★ 의존성 주입을 받을 MyUtil 클래스도 의존성 주입을 통해 호출되어야 MyUtil 생성자가 의존성 주입을 받는다. MyUtil 클래스에서 생성자가 쿠키/세션사용을 위해 IHttpContextAccessor 주입받으므로, MyUtil 클래스도 주입받아야한다. services.AddTransident<UtilClass.MyUtil>();
★ MyUtilClass 에서 주입받을 IHttpContextAccessor services.AddTransient<IHttpContextAccessor , HttpContextAccessor>(); }
※ DLL 모듈 public Class MyUtil { private IHttpContextAccessor _contenxt;
public MyClass() { }
public MyClass(IHttpContextAccessorcontext) { this._contenxt = context; }
※ DLL 참조하는 웹 프로젝트 메서드 – 사용자 클래스 public Class HomeController { private readonly Class.MyClass _myClass;
// public HomeController(Class.MyClassmyClass) { this._myClass = myClass; }
public IActionResult GetInfoFromDLL() { var info = _myClass.getCurrentUser(); ViewBag.inherit = info; return View(); } }
★ 만약 HomeController 가 IHttpContextAccessor 를 주입받는 myClass 를 주입식이 아닌, 직접 생성자를 통해 받게되면, public IActionResult GetInfoFromDLL() { var myClass = new myClass(); // 의존성 주입이 일어나지않음 var info = _myClass.getCurrentUser(); // 이때 getCurrentuser 의 this._context 는 null reference exception 발생함 ViewBag.inherit = info; return View(); }