2017-11-06 2 views
0

내 응용 프로그램에서 내가 저장 한 세션 변수를 가져 와서 존재하는 사용자가 있는지 확인하고 싶습니다. 내가 세션 변수를 얻기 위해 사용하는 코드는 다음과 같습니다 :Startup.cs에서 세션 값에 액세스 할 수 없음

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
{ 
    // Some other default code. 
    app.UseSession(); 

    app.Use((context, next) => 
    { 
     int? userId = context.Session.GetInt32("User"); 
     // Use the variable. 

     return next(); 
    }); 
} 

나는 그것이 비어 있고 맥락에서 값이없는 디버거 변수를 확인합니다.

나는 세션 작동하도록() 메소드 ConfigureServices에 Startup.cs에 다음 코드를 추가 :

services.AddSession(options => 
{ 
    options.IdleTimeout = TimeSpan.FromMinutes(20); 
    options.Cookie.HttpOnly = true; 
}); 

내 컨트롤러에이 방법으로 세션을 설정 한 경우 :

HttpContext.Session.SetInt32("User", user.Id); 

그리고 내 컨트롤러에서 세션 변수를 아래와 같이 얻으십시오.

HttpContext.Session.GetInt32("User"); 

예상대로 작동하며 나의 가치를 되 찾을 수 있습니다.

Startup.cs에서이 기능이 작동하지 않는 이유는 무엇입니까?

+1

'Configure'는 요청 당 * app start *에서 실행된다는 것을 알아야합니다. 결과적으로이 작업을 수행하더라도 사용자가 작성하지 않은 요청을 포함하여 요청간에 사용자 ID를 유출하게됩니다. 본질적으로, 앱 시작 후 첫 번째 사용자 일 뿐이고 다른 모든 요청은 거의 확실하게 * 사용자가 원하는 * 동일한 * 사용자 ID를 사용합니다. –

+0

@ChrisPratt 감사합니다. 디버깅 중에이 사실을 알았습니다. 모든 요청에 ​​대해 생각했습니다. 요청 당 세션 값을 확인하는 올바른 방법이 있습니까? – Arendax

+0

액션/필터/내부. - 요청 당 실제로 호출되는 것. 'Startup'에서 이와 같은 일을 할 수 없습니다. 왜냐하면 그 모든 일은 오직 한 번만 실행되기 때문입니다. –

답변

3

시나리오를 재구성하여 예상대로 작동하는지 확인할 수 있습니다. 미들웨어와 컨트롤러 모두에서 세션에 액세스 할 수 있습니다.

세션 변수를 어딘가에 설정 하시겠습니까? 미들웨어 내에서 액세스 할 때에도 먼저 변수를 설정해야합니다. 컨트롤러에 설정하면 미들웨어가 먼저 실행되고 세션은 첫 번째 요청시 비어있게됩니다.

또한 사용하는 캐싱 메커니즘에 따라 세션이 응용 프로그램을 다시 시작할 때까지 유지되지 않습니다. 기본 메커니즘은 DistributedMemoryCache을 사용하는 것으로 세션을 메모리에 유지합니다. 로드 밸런서 뒤에있는 여러 컴퓨터에서 응용 프로그램을 호스팅하는 경우 세션이 비어있는 또 다른 이유가있을 수 있습니다.

그러나 지금까지 코드는 절대적으로 유효하고 내 컴퓨터에서 작동합니다.

관련 문제