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;

//to clear the session value

Session["products"]=null;
解説 (9)

Webはステートレスな性質を持っているため、セッションはオブジェクトをシリアライズしてセッションに保存することで、リクエスト間でオブジェクトを持続させる非常に便利な方法でもあります。

例えば、アプリケーション全体で定期的に情報にアクセスする必要がある場合、リクエストごとにデータベースを呼び出す手間を省くために、次のようにデータをオブジェクトに格納し、リクエストごとにシリアライズしないようにすることができます。

**再利用可能なシリアル化可能なオブジェクト:***。

[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().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 ファイルに登録します。

セッションオブジェクトの注入に慣れていない方のために、このテーマに関するより詳細なブログ記事こちらをご用意しました。

警告の言葉:

セッションは最小限にとどめるべきで、大きなセッションはパフォーマンスの問題を引き起こす可能性があります。

また、セッションには機密データ(パスワードなど)を保存しないことをお勧めします。

解説 (3)

これが、ASP.NETとASP.NET MVCにおけるセッションステートの仕組みです。

ASP.NET セッションステートの概要をご覧ください。

基本的には、Sessionオブジェクトに値を保存するために行います。

Session["FirstName"] = FirstNameTextBox.Text;

値を取り出すには

var firstName = Session["FirstName"];
解説 (3)