ASP.NET MVC를 처음 사용합니다. 이전에 PHP를 사용한 적이 있으며 세션을 만들고 현재 세션 변수를 기반으로 사용자 레코드를 선택하는 것이 쉬웠습니다.
C # ASP.NET MVC 4 응용 프로그램에서 세션을 만들고 사용하는 방법을 보여줄 수있는 간단한 단계별 자습서를 인터넷의 모든 곳에서 살펴 보았습니다. 컨트롤러의 어느 곳에서나 액세스 할 수 있고 LINQ 쿼리에서 변수를 사용할 수있는 사용자 변수로 세션을 만들고 싶습니다.
ASP.NET MVC를 처음 사용합니다. 이전에 PHP를 사용한 적이 있으며 세션을 만들고 현재 세션 변수를 기반으로 사용자 레코드를 선택하는 것이 쉬웠습니다.
C # ASP.NET MVC 4 응용 프로그램에서 세션을 만들고 사용하는 방법을 보여줄 수있는 간단한 단계별 자습서를 인터넷의 모든 곳에서 살펴 보았습니다. 컨트롤러의 어느 곳에서나 액세스 할 수 있고 LINQ 쿼리에서 변수를 사용할 수있는 사용자 변수로 세션을 만들고 싶습니다.
답변:
시험
//adding data to session
//assuming the method below will return list of Products
var products=Db.GetProducts();
//Store the products to a session
Session["products"]=products;
//To get what you have stored to a session
var products=Session["products"] as List<Product>;
//to clear the session value
Session["products"]=null;
WebSecurity.CurrentUserId
데이터베이스에서 여러 번 가져 오지 않도록 값을 저장하는 것이 안전 합니까 (매우 비용이 많이 든다는 것을 알았습니다)?
Account/LogOn
to Home/Index
) Session["FirstName"]
는 null
입니다. 개발자는 부모 컨트롤러 ( BaseController
) 를 만들고 internal protected HttpSessionStateBase SharedSession
모든 하위 컨트롤러에서 공유 세션 변수를 노출 할 수 있는 보호 된 필드 ( )를 정의해야합니다 ( 이는 모든 앱 컨트롤러가에서 상속한다고 가정 BaseController
)
웹의 상태 비 저장 특성으로 인해 세션은 요청을 직렬화하고 세션에 저장하여 요청간에 객체를 유지하는 매우 유용한 방법이기도합니다.
이것의 완벽한 사용 사례는 애플리케이션 전체에서 정기적 인 정보에 액세스하고 각 요청에 대한 추가 데이터베이스 호출을 저장해야하는 경우 다음과 같이 객체에 저장되고 각 요청에서 직렬화 해제 될 수 있습니다.
재사용 가능하고 직렬화 가능한 객체 :
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
사용 사례 :
public class LoginController : Controller {
[HttpPost]
public ActionResult Login(LoginModel model)
{
if (ModelState.IsValid)
{
var profileData = new UserProfileSessionData {
UserId = model.UserId,
EmailAddress = model.EmailAddress,
FullName = model.FullName
}
this.Session["UserProfile"] = profileData;
}
}
public ActionResult LoggedInStatusMessage()
{
var profileData = this.Session["UserProfile"] as UserProfileSessionData;
/* From here you could output profileData.FullName to a view and
save yourself unnecessary database calls */
}
}
이 개체가 직렬화되면 개체를 만들거나 데이터베이스에 포함 된 데이터를 다시 쿼리 할 필요없이 모든 컨트롤러에서 사용할 수 있습니다.
종속성 주입을 사용하여 세션 개체 삽입
이상적인 세계에서는 ' 구현이 아닌 인터페이스에 프로그래밍 '하고 선택한 Inversion of Control 컨테이너를 사용하여 직렬화 가능한 세션 개체를 컨트롤러에 삽입합니다 (이 예제에서는 내가 가장 잘 알고있는 StructureMap 사용). ).
public class WebsiteRegistry : Registry
{
public WebsiteRegistry()
{
this.For<IUserProfileSessionData>().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession());
}
public static IUserProfileSessionData GetUserProfileFromSession()
{
var session = HttpContext.Current.Session;
if (session["UserProfile"] != null)
{
return session["UserProfile"] as IUserProfileSessionData;
}
/* Create new empty session object */
session["UserProfile"] = new UserProfileSessionData();
return session["UserProfile"] as IUserProfileSessionData;
}
}
그런 다음이를 Global.asax.cs
파일에 등록 합니다.
세션 객체 삽입에 익숙하지 않은 사용자는 여기 에서 주제에 대한보다 심층적 인 블로그 게시물을 찾을 수 있습니다 .
경고의 말씀 :
세션을 최소로 유지해야하며 대규모 세션이 성능 문제를 일으킬 수 있다는 점은 주목할 가치가 있습니다.
또한 민감한 데이터 (암호 등)를 저장하지 않는 것이 좋습니다.
다음은 ASP.NET 및 ASP.NET MVC에서 세션 상태가 작동하는 방식입니다.
기본적으로 세션 개체에 값을 저장하려면 다음을 수행합니다.
Session["FirstName"] = FirstNameTextBox.Text;
값을 검색하려면 :
var firstName = Session["FirstName"];
Account
to Home
) Session [ "FirstName"]은 null입니다. 개발자는 BaseController
보호 된 필드 를 만들고 정의해야합니다 (internal protected HttpSessionStateBase SharedSession
Session
모든 하위 컨트롤러에서 공유 변수를 노출 할 수 ) 이는 모든 앱 컨트롤러가에서 상속한다고 가정 BaseController
)
U는 Session [ "FirstName"] = FirstNameTextBox.Text와 같은 세션에 모든 값을 저장할 수 있습니다. 그러나 나는 모델의 정적 필드로 값을 할당하고 응용 프로그램의 어느 곳에서나 해당 필드 값에 액세스 할 수 있다고 제안합니다. 세션이 필요하지 않습니다. 세션은 피해야합니다.
public class Employee
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public static string FullName { get; set; }
}
컨트롤러에서-Employee.FullName = "ABC"; 이제 응용 프로그램에서이 전체 이름에 액세스 할 수 있습니다.