Tạp chí Thợ Code

Có gì mới trong ASP.NET Core 9?

.NET 9 mang đến một số cải tiến về hiệu năng và thay đổi nhỏ. Tuy nhiên, phiên bản này không có nhiều thay đổi lớn để thay đổi hoàn toàn cách chúng ta viết code.

MapStaticAssets

Các file trong thư mục wwwroot có thể được chi phép truy xuất từ cho Internet bằng cách gọi:

app.UseStaticFiles();

Tuy nhiên, phương thức này không đảm bảo rằng ứng dụng sẽ phục vụ các file một cách tối ưu. Thực tế, có các cơ chế khác để đảm bảo cache hoạt động đúng cách, ví dụ như dựa vào ngày sửa đổi cuối cùng của file. Tuy nhiên, cơ chế này chỉ hoạt động nếu bạn dùng WebDeploy để triển khai ứng dụng từ một máy tính. Nếu bạn sử dụng continuous integration, sau khi biên dịch, tất cả các file sẽ có ngày tạo được thiết lập vào thời điểm biên dịch diễn ra. Các file đều có ngày mới hơn so với những file cũ, do đó tất cả sẽ được tải lên (bất kể chúng có thay đổi thực sự hay không). Giao thức HTTP đã tính đến điều này và hỗ trợ ETag, là một hash của từng file. Vì vậy, .NET có thể tự động tính toán các hash của các file cá nhân. Và đó là điều mà .NET 9 thực hiện thông qua middleware mới:

app.MapStaticAssets();

Hybrid cacheHybridCache

Là một lớp trừu tượng trong một package riêng biệt 📦, thay thế cho các IMemoryCacheIDistributedCache hiện có. Nó cung cấp một giao diện đồng nhất cho việc caching, bất kể dữ liệu được lưu trữ trong in-process hay out-of-process. Cache này đảm bảo rằng một giá trị chỉ được tạo cho một key duy nhất, ngay cả khi giá trị có cùng key được yêu cầu nhiều lần trong quá trình tạo bất đồng bộ của nó (hiện tượng này được gọi là cache stampede hoặc dog-piling). Rất đơn giản để sử dụng:

builder.Services.AddHybridCache();
...

public class DoWork(HybridCache hybridCache) {
    public async Task GetDataAsync(string key) {
        return await hybridCache.GetOrCreateAsync(key, async entry => {
            ...
        });
    }
}

Binary formatter

Lớp BinaryFormatter, đã có trong .NET từ phiên bản 1.1, được sử dụng để (de)serialize các đối tượng trực tiếp thành một luồng dữ liệu. Chính xác hơn, nó đã từng được dùng. Từ .NET 9, NotSupportedException sẽ được ném ra. Các lý do cho bước đi này đã được giải thích rõ bởi Barry Dorrans, quản lý chương trình bảo mật chính. Cách thức hoạt động của lớp này đã gây ra nhiều lỗ hổng bảo mật trong Microsoft Exchange, Azure DevOps và Microsoft Sharepoint. Không thể sửa lỗi này mà không ảnh hưởng lớn đến tính tương thích ngược. Ban đầu, Microsoft đã lên kế hoạch loại bỏ lớp này vào năm 2016, khi phát hành .NET Core 1.0, trong đó không bao gồm nó. Tuy nhiên, điều này đã vấp phải sự phản đối từ các nhà phát triển. Một số người đã lấy mã từ .NET Framework và tạo thành một package riêng 📦 cho .NET Core, và Microsoft cũng nhận được nhiều email từ các khách hàng lớn, rằng họ không thể chuyển các dự án của mình sang .NET Core do thiếu lớp này. Vì vậy, Microsoft đã quyết định đưa nó trở lại trong .NET Core phiên bản 1.1.

Nhưng, nếu bạn cần sử dụng nó trong trường hợp không còn cách nào khác?

<PropertyGroup>
  <TargetFramework>net9.0</TargetFramework>
  <EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>

<ItemGroup>
  <PackageReference Include="System.Runtime.Serialization.Formatters" Version="9.0.0-*" />
</ItemGroup>

Nhưng nếu bạn thực sự thêm mã trên vào dự án, hãy sao lưu dữ liệu trong database của bạn thật cẩn thận. 🙏

Biên soạn: Tí Dev