TOC

This article is currently in the process of being translated into Vietnamese (~44% done).

HttpContext:

Sessions

Trong chương trước chúng ta đã nói về cookies và tầm quan trọng của nó trong công nghệ web, vì protocol HTTP không lưu trữ trạng thái. Trong hầu hết các framework web, kể cả các framework cũ như PHP và ASP thì khái niệm phiên làm việc session vẫn tồn tại.

Sessions vs. Cookies

Trong khi cookies dùng để chia sẻ dữ liệu giữa các yêu cầu trong khoảng thời gian dài, thậm chí vài năm thì session dùng trong khoảng thời gian ngắn. Nói chung bạn nên xử lý dữ liệu trong session là tạm thời - nó có thể biến mất bất kỳ lúc nào ví dụ khi người dùng đóng trình duyệt hoặc khởi động lại thiết bị.

Mặc định là dữ liệu session có thể lưu trữ 20 phút từ request cuối cùng. Vậy nếu bạn truy cập vào một trang và dữ liệu session được lưu trữ cho bạn. Có 20 phút thì nó sẽ bị xóa đi nếu bạn không có yêu cầu mới. Bạn có thể thay đổi thời gian này nhưng không nên cố găng lưu dữ liệu trong thời gian dài.

Vậy, nếu bạn cố gắng lưu dữ liệu giữa các session thì hãy dùng cookies - ngoài ra thì session là một lựa chọn tuyệt vời. Để hiểu về sự khác biệt, hãy nghĩ về hệ thống login, mà người dùng có thể dùng checkbox "Stay logged in": Nếu không chọn thì trạng thái login có thể giữ trong session và sau đó biến mất khi người dùng đóng trình duyệt. Nếu chọn thì nên dùng cookie, và lần tiếp theo được dùng khi họ mở lại trình duyệt và tới trang.

Tuy vậy, nói chung, session không thể tồn tại mà không có cookie. Do cookie được lưu trong máy tính của người dùng còn session thì lưu trong server. Khi có nhiều người truy cập trang thì sẽ quản lý thông qua session ID.

ASP.NET Core MVC: Adding support for Sessions

Trong phiên bản trước của ASP và ASP.net framework, Sessions sẽ có sẵn ngay lập tức. ASP.NET Core mặc dù nhiều mô đun hơn, cho phép bạn thêm những khối dữ liệu bạn cần. Sessions là một trong những khối này, vì vậy chúng ta sẽ phải thêm hỗ trợ cho nó. Điều này yêu cầu hai bước:

First, you need to install the Microsoft.AspNetCore.Session NuGet package in your project. It contains all the stuff you need to support sessions. You can install it from the UI, or by using the NuGet Console: From the Tools menu, select NuGet Package Manager -> Package Manager Console. In the Console Tool window which appears, simply type the following command and press Enter:

Install-Package Microsoft.AspNetCore.Session

After the package is installed, the second and final step is to add the support to your website. It's done in the Startup.cs file, first by calling the AddSession() extensions methods in the ConfigureServices() method, like this:

public void ConfigureServices(IServiceCollection services)
{    
    services.AddSession();
    services.AddMvc();        
}

Notice that you can, optionally, pass in one or several options to be used by the Session functionality. One of the things you can configure with this approach is the Timeout duration, as described previously in this article, like this:

services.AddSession(options => 
    {
options.IdleTimeout = TimeSpan.FromMinutes(30);
    });

Secondly, you have to call the UseSession() extension method from the Configure() method:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
app.UseDeveloperExceptionPage();
    }    
    app.UseSession();
    app.UseMvcWithDefaultRoute();
}

Using Sessions

With Session support enabled, we can now start using them by accessing the Session property on the HttpContext. When you include the Microsoft.AspNetCore.Http namespace, you can access several Get* and Set* methods which can be used to retrieve and store data as session data.

Allow me to demonstrate this with a complete, although very simple, example. It's basically a View with a Form, where the user can enter their name. Once submitted, the name is stored as session data and then automatically passed to the View and input field. This will allow you to see the entered name even after the redirect or reloading the page. First, the View:

@model string
<h1>Sessions</h1>
<form asp-action="SaveName" method="post">
    Your name:
    <input type="text" name="name" value="@Model" />
    <input type="submit" value="Save" />
</form>

Notice how I define the Model to be a string in the top, and then use it inside the textbox. This allows me to pass this simple string into the View from the Controller:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace HelloMVCWorld.Controllers
{
    public class SessionsController : Controller
    {
public IActionResult Index()
{
    string name = HttpContext.Session.GetString("Name");
    return View(model: name);
}

public IActionResult SaveName(string name)
{
    HttpContext.Session.SetString("Name", name);
    return RedirectToAction("Index");
}
    }
}

It's all very basic: In the Index() action, I try to fetch the session data with the GetString() method, using "Name" as the key. If its not already there, a NULL will be returned - no matter what, we simply pass it to the View() method. In the SaveName() action, which the FORM posts back to, we use the SetString() method, passing in "Name" as the key and the submitted "name" as the value. Then we redirect to the Index() action, which can now read the newly saved "Name" and display it in the textbox:

Congratulations, you have now enabled and used sessions in your ASP.NET Core project! There are a couple of additional Get* and Set* methods for you to use, e.g. GetInt32()/SetInt32() for integers and Get()/Set() for byte arrays.

Summary

Sessions can be great for storing temporary data across multiple requests in a browsing session. If you need more permanent storage, e.g. across multiple sessions, you should use cookies.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!