[asp.net-mvc] ASP.NET MVC 4 응용 프로그램에서 세션을 사용하는 방법은 무엇입니까?

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;


답변

웹의 상태 비 저장 특성으로 인해 세션은 요청을 직렬화하고 세션에 저장하여 요청간에 객체를 유지하는 매우 유용한 방법이기도합니다.

이것의 완벽한 사용 사례는 애플리케이션 전체에서 정기적 인 정보에 액세스하고 각 요청에 대한 추가 데이터베이스 호출을 저장해야하는 경우 다음과 같이 객체에 저장되고 각 요청에서 직렬화 해제 될 수 있습니다.

재사용 가능하고 직렬화 가능한 객체 :

[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에서 세션 상태가 작동하는 방식입니다.

ASP.NET 세션 상태 개요

기본적으로 세션 개체에 값을 저장하려면 다음을 수행합니다.

Session["FirstName"] = FirstNameTextBox.Text;

값을 검색하려면 :

var firstName = Session["FirstName"];


답변

다음을 사용하여 세션에 모든 종류의 데이터를 저장할 수 있습니다.

Session["VariableName"]=value;

이 변수는 20 분 정도 지속됩니다.


답변

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”; 이제 응용 프로그램에서이 전체 이름에 액세스 할 수 있습니다.


답변