Một SignalR hub là một lớp trung gian cao cấp cho phép các khách hàng và máy chủ gọi các phương thức vào nhau. Nó cho phép các ứng dụng thực hiện giao tiếp hai chiều giữa máy chủ và khách hàng, cho phép các máy chủ gửi thông tin đến các khách hàng và ngược lại. Điều này giúp tạo ra các ứng dụng thời gian thực, chẳng hạn như trò chơi trực tuyến, ứng dụng thời gian thực và các ứng dụng khác yêu cầu giao tiếp đồng bộ giữa máy chủ và khách hàng.
Quiz: PRN222_RE_B5_SU26 - Có đáp án và giải thích chi tiết
Phiên có lưu tiến độ dùng toàn bộ 50 câu của bộ đề để tiến độ khớp với máy chủ.
Bạn cần đăng nhập để bắt đầu làm bài và lưu tiến độ.
50
Không giới hạn
0
50
50
Xem trước câu hỏi
Blazor là một công cụ giúp xây dựng giao diện người dùng (UI) web tương tác bằng cách sử dụng ngôn ngữ lập trình C# thay vì JavaScript. Nó cho phép các nhà phát triển xây dựng các ứng dụng web động bằng cách sử dụng các thành phần và các yếu tố UI được xây dựng bằng C#. Blazor sử dụng mô hình hai chiều (two-way data binding), điều này có nghĩa là dữ liệu được đồng bộ hóa giữa phía client và phía server. Điều này giúp giảm thiểu sự phức tạp và tăng cường hiệu suất của ứng dụng. Blazor cũng hỗ trợ các tính năng như sự kiện, giao tiếp giữa các thành phần và các tính năng bảo mật.
Trong ASP.NET Core MVC, [HttpPost] là một thuộc tính được sử dụng để chỉ định phương thức hành động (action method) sẽ xử lý yêu cầu HTTP POST. Khi một yêu cầu HTTP POST được gửi đến ứng dụng, [HttpPost] sẽ giúp xác định phương thức hành động nào sẽ được thực hiện để xử lý yêu cầu này. Điều này cho phép nhà phát triển có thể kiểm soát và quản lý các yêu cầu HTTP POST một cách hiệu quả. Ngoài ra, [HttpPost] cũng giúp ngăn chặn các yêu cầu HTTP POST không mong muốn từ được xử lý bởi các phương thức hành động khác. Vì vậy, [HttpPost] là một công cụ quan trọng trong việc xây dựng các ứng dụng web dựa trên ASP.NET Core MVC.
Sự nguyên tắc phụ thuộc ngược (Dependency Inversion Principle) là một nguyên tắc thiết kế quan trọng trong lập trình hướng đối tượng. Nó cho rằng các mô-đun cao cấp (high-level modules) và mô-đun thấp cấp (low-level modules) nên phụ thuộc vào các abstraction (tính trừu tượng) chứ không phải vào nhau. Điều này có nghĩa là thay vì các mô-đun cao cấp phụ thuộc vào các mô-đun thấp cấp cụ thể, chúng nên phụ thuộc vào các interface hoặc abstraction chung. Điều này giúp giảm sự phụ thuộc giữa các mô-đun và tăng tính linh hoạt, dễ dàng thay đổi và mở rộng hệ thống.
Trong C#, lớp TaskScheduler đóng vai trò chính là quản lý việc sắp xếp các tác vụ (task) vào các luồng (thread). Lớp này chịu trách nhiệm đảm bảo rằng các tác vụ được thực hiện một cách hiệu quả và an toàn. Khi bạn tạo một tác vụ mới, nó sẽ được thêm vào hàng đợi của TaskScheduler, và sau đó sẽ được thực hiện bởi một luồng thích hợp. Điều này giúp tránh được tình trạng xung đột giữa các tác vụ và đảm bảo rằng các tác vụ được thực hiện một cách đồng bộ. Ngoài ra, lớp TaskScheduler cũng cung cấp các phương thức để quản lý và điều khiển các tác vụ, chẳng hạn như hủy bỏ tác vụ, chờ đợi tác vụ hoàn thành, v.v.
Đáp án đúng: A. Địa chỉ IP là một định danh duy nhất gán cho một giao diện mạng của thiết bị trong mạng dùng bộ giao thức TCP/IP, nhờ đó các gói tin biết được nơi gửi và nơi nhận. Một máy có nhiều card mạng sẽ có nhiều địa chỉ IP, đúng theo cách nói "định danh cho một giao diện mạng" chứ không phải cho cả máy. Phương án B nhầm sang khái niệm giao thức - tập quy tắc truyền dữ liệu như TCP hay UDP; phương án C mô tả phần cứng vật lý là dây cáp; phương án D nhầm sang các biện pháp bảo mật như tường lửa, đều không phải bản chất của địa chỉ IP.
Đáp án đúng: D. Khi chọn handler, Razor Pages bỏ hậu tố "Async" khỏi tên phương thức. Do đó OnGet và OnGetAsync cùng quy về một handler cho phương thức GET, và bộ chọn DefaultPageHandlerMethodSelector tìm thấy HAI ứng viên cùng khớp nên ném InvalidOperationException với thông báo nhiều handler cùng khớp. Đây là lỗi phát sinh LÚC CHẠY. Trình biên dịch không báo lỗi vì hai phương thức có tên khác nhau hoàn toàn hợp lệ trong C#, nên phương án C bị loại; và framework không tự ưu tiên bản đồng bộ hay bất đồng bộ, nên A và B đều sai.
Đáp án đúng: B. ViewBag và ViewData là hai cơ chế truyền dữ liệu MỘT CHIỀU từ action của controller sang view trong phạm vi cùng một request: ViewData là từ điển kiểu object nên phải ép kiểu khi dùng, còn ViewBag là lớp bọc dynamic quanh chính từ điển đó nên viết gọn hơn. Cả hai đều mất giá trị ngay khi request kết thúc, vì vậy phương án A sai - muốn giữ dữ liệu qua nhiều request phải dùng TempData hoặc Session. Quản lý phiên (C) là việc của Session; còn mã hoá dữ liệu (D) không liên quan gì tới hai cơ chế này.
BackgroundService là một lớp trong .NET Core được sử dụng để tạo các dịch vụ chạy nền. Nó thực hiện một số giao diện quan trọng, bao gồm IHostedService. Giao diện IHostedService cho phép các dịch vụ chạy nền được quản lý và khởi động bởi IWebHost. Điều này cho phép các dịch vụ chạy nền được khởi động và dừng cùng với ứng dụng. Ngoài ra, giao diện IHostedService cũng cung cấp các phương thức như StartAsync và StopAsync để quản lý trạng thái của dịch vụ chạy nền. Vì vậy, khi nói về giao diện mà BackgroundService thực hiện nội bộ, câu trả lời chính xác là IHostedService.
Một Worker Service trong ASP.NET Core là một loại ứng dụng web không tương tác, chạy nền và không có giao diện người dùng. Nó được sử dụng để thực hiện các tác vụ lặp đi lặp lại, chẳng hạn như gửi email, cập nhật dữ liệu cơ sở dữ liệu hoặc thực hiện các tác vụ khác mà không cần tương tác với người dùng. Thời gian tồn tại của một Worker Service thường kéo dài cho đến khi ứng dụng được dừng lại thủ công. Điều này có nghĩa là Worker Service sẽ tiếp tục chạy cho đến khi ứng dụng được dừng lại hoặc bị lỗi. Điều này cho phép Worker Service thực hiện các tác vụ lặp đi lặp lại mà không cần phải khởi động lại sau mỗi lần thực hiện.
Đáp án đúng: C. Trong DI của ASP.NET Core có ba vòng đời. Transient tạo một thể hiện MỚI mỗi lần được yêu cầu, phù hợp với dịch vụ nhẹ, không giữ trạng thái. Scoped (B) tạo một thể hiện cho mỗi phạm vi, trong ứng dụng web là mỗi HTTP request - điển hình là DbContext. Singleton (A) chỉ tạo một thể hiện duy nhất dùng suốt vòng đời ứng dụng. "Isolated" (D) không phải một vòng đời trong hệ thống DI tích hợp sẵn của .NET.
Một giao thức mạng (network protocol) là một tập hợp các quy tắc và tiêu chuẩn được sử dụng để quản lý và điều khiển việc truyền tải dữ liệu qua mạng. Nó giúp đảm bảo rằng dữ liệu được truyền đi một cách chính xác và hiệu quả. Giao thức mạng bao gồm các quy tắc về cách thức truyền tải dữ liệu, cách thức xử lý lỗi, cách thức quản lý lưu lượng và cách thức đảm bảo an toàn cho dữ liệu. Ví dụ, giao thức TCP/IP là một giao thức mạng phổ biến được sử dụng để truyền tải dữ liệu qua internet.
Trong mã nguồn C#, ExecuteAsync là phương thức được sử dụng để thực hiện các tác vụ nền (background tasks). Nó là phương thức được gọi khi một đối tượng thực hiện các tác vụ nền (background service) được tạo ra. Phương thức này được sử dụng để thực hiện các tác vụ nền một cách độc lập và không ảnh hưởng đến luồng chính của chương trình. Trong ví dụ trên, Worker là một lớp thực hiện các tác vụ nền và ExecuteAsync là phương thức được sử dụng để thực hiện các tác vụ nền này. Phương thức ExecuteAsync được gọi khi Worker được tạo ra và nó sẽ thực hiện các tác vụ nền một cách độc lập.
Để xử lý sự kiện cho một kết nối SignalR trên phía client, bạn cần sử dụng JavaScript. Bạn có thể sử dụng phương thức on() để đăng ký một sự kiện và phương thức off() để hủy đăng ký. Ví dụ, bạn có thể sử dụng phương thức on('connected', function() { ... }) để đăng ký một sự kiện khi kết nối được thiết lập thành công. Ngoài ra, bạn cũng có thể sử dụng phương thức on('reconnected', function() { ... }) để đăng ký một sự kiện khi kết nối được phục hồi sau khi bị mất kết nối. Điều này cho phép bạn thực hiện các hành động cụ thể khi kết nối thay đổi trạng thái.
Đáp án đúng: B. UDP là giao thức phi kết nối ở tầng giao vận: nó gửi datagram đi mà không thiết lập kết nối trước, không đánh số thứ tự, không báo nhận và không truyền lại, nên nhanh và nhẹ nhưng không bảo đảm gói tin tới nơi hay tới đúng thứ tự. TCP (A) ngược lại, hướng kết nối với bắt tay ba bước, báo nhận và truyền lại nên bảo đảm tin cậy. HTTP (C) và FTP (D) là giao thức tầng ứng dụng và đều chạy trên nền TCP, do đó thừa hưởng tính tin cậy của TCP.
Đáp án đúng: D. Tính toán tuần tự nghĩa là chương trình chạy trên MỘT bộ xử lý, các lệnh được thực hiện lần lượt, mỗi thời điểm chỉ một lệnh - đúng như các phát biểu A, B và C. Vì vậy phát biểu "tất cả các lệnh chạy song song trên nhiều luồng" là điều KHÔNG đúng với tính toán tuần tự; đó chính là đặc trưng của tính toán song song, nơi bài toán được chia nhỏ và thực hiện đồng thời trên nhiều lõi hoặc nhiều bộ xử lý. Câu hỏi yêu cầu chọn phát biểu SAI nên đáp án là D.
Model Binding trong Razor Pages là một tính năng cho phép ánh xạ dữ liệu từ yêu cầu HTTP đến các thuộc tính của PageModel. Điều này cho phép bạn dễ dàng lấy dữ liệu từ yêu cầu HTTP và sử dụng nó trong trang Razor Pages của mình. Ví dụ, nếu bạn có một trang Razor Pages với một form và bạn muốn lấy dữ liệu từ form đó, bạn có thể sử dụng Model Binding để ánh xạ dữ liệu từ form đến các thuộc tính của PageModel. Điều này giúp giảm thiểu mã code và làm cho trang Razor Pages của bạn trở nên dễ dàng hơn để quản lý.
Một dịch vụ có thời gian sống đượcScoped là một dịch vụ có thể được tạo mới và hủy bỏ trong mỗi yêu cầu. Ví dụ về một tình huống nơi một dịch vụ có thời gian sống đượcScoped sẽ phù hợp là khi bạn cần một đối tượng cơ sở dữ liệu cụ thể cho mỗi yêu cầu trong một ứng dụng web. Điều này có thể giúp ngăn chặn các vấn đề về đồng bộ hóa và đảm bảo rằng mỗi yêu cầu có một đối tượng cơ sở dữ liệu độc lập.
Đáp án đúng: C. TcpClient.GetStream() trả về đối tượng NetworkStream gắn với kết nối TCP đã thiết lập; đây chính là luồng hai chiều để đọc và ghi dữ liệu với đầu bên kia, thường dùng kèm StreamReader/StreamWriter hoặc các phương thức Read/Write trực tiếp. Địa chỉ IP và cổng của phía đối tác (A, B) lấy qua thuộc tính Client.RemoteEndPoint chứ không phải GetStream. Đóng kết nối (D) là việc của Close() hoặc Dispose(), thường được gọi trong khối using.
Đáp án đúng: B. PageModel là lớp code-behind của một Razor Page: nó chứa các handler OnGet, OnPost, OnGetAsync... để xử lý request theo phương thức HTTP, chứa các thuộc tính được model binding gán dữ liệu từ request, và cung cấp dữ liệu cho phần giao diện .cshtml truy cập qua @Model. Nói cách khác nó gộp vai trò của controller và view model trong MVC. Định nghĩa lược đồ cơ sở dữ liệu (A) là việc của entity và DbContext; quản lý phiên (C) là của Session; bố cục giao diện (D) do _Layout.cshtml đảm nhiệm.
Đáp án đúng: A. Inversion of Control là nguyên lý trong đó luồng điều khiển bị ĐẢO NGƯỢC so với lập trình thủ tục truyền thống: thay vì mã của bạn tự khởi tạo và gọi các thành phần phụ thuộc, framework hoặc container sẽ nắm quyền điều khiển và cung cấp chúng cho bạn - Dependency Injection chính là một cách hiện thực hoá IoC. Nhờ đó lớp chỉ khai báo cái nó cần chứ không quyết định cái nó dùng, giúp giảm ghép nối và dễ kiểm thử. Các phương án B, C, D nói về quản lý bộ nhớ, tối ưu lưu lượng mạng và mã hoá, đều không liên quan.
Đáp án đúng: B. Razor Pages ánh xạ phương thức HTTP tới handler theo quy ước tên: OnGet cho GET, OnPost cho POST, kèm biến thể bất đồng bộ OnPostAsync và biến thể có tên như OnPostDeleteAsync khi dùng asp-page-handler. Vì biểu mẫu gửi lên bằng POST nên OnPost() là phương thức xử lý. Các tên OnSubmit() (A), SubmitForm() (C) và Post() (D) không nằm trong quy ước đặt tên handler của Razor Pages nên sẽ không bao giờ được framework gọi tới.
Đáp án đúng: A. Worker Service là mẫu dự án .NET dựng sẵn Generic Host, nhờ đó có ngay Dependency Injection, Logging, Configuration, IHostedService và quản lý vòng đời khởi động - tắt êm. Đó là lý do chính để chọn nó thay vì viết Windows Service thuần. Phương án B sai vì Worker Service không có giao diện; phương án C sai vì hoàn toàn xuất bản và cài đặt được như một dịch vụ Windows hoặc systemd; phương án D sai vì đây là ứng dụng .NET đa nền tảng, chạy được cả trên Linux và trong container.
Để đăng ký dịch vụ Razor Pages vào container DI trong Program.cs, bạn cần sử dụng phương thức builder.Services.AddRazorPages(). Phương thức này cho phép ASP.NET Core biết rằng ứng dụng của bạn sử dụng Razor Pages và cần đăng ký các dịch vụ liên quan. Khi bạn gọi phương thức này, các dịch vụ cần thiết cho Razor Pages sẽ được đăng ký vào container DI, bao gồm các dịch vụ như Razor Pages Model, Razor Pages Controller, v.v. Điều này cho phép bạn sử dụng các tính năng của Razor Pages trong ứng dụng của mình.
Đáp án đúng: C. Trong các dự án Blazor Server và Blazor WebAssembly, thành phần Router được khai báo trong App.razor: nó nhận AppAssembly để quét các trang có chỉ thị @page, định nghĩa Found và NotFound, và bọc trong RouteView để dựng layout. Program.cs (A) chỉ đăng ký dịch vụ và cấu hình pipeline; Startup.cs (D) là kiểu tổ chức cũ đã bị gộp vào Program.cs từ .NET 6. Lưu ý mẫu Blazor Web App của .NET 8 tách phần Router sang Routes.razor (B), nhưng trong phạm vi Blazor Server/WebAssembly của môn học thì App.razor là câu trả lời.
Đáp án đúng: B. Để dùng Entity Framework Core trong một dự án Blazor Web App, ta cài các gói NuGet cần thiết như Microsoft.EntityFrameworkCore, gói provider tương ứng (SqlServer, Sqlite...) và Microsoft.EntityFrameworkCore.Tools; sau đó định nghĩa lớp DbContext và đăng ký nó vào DI bằng builder.Services.AddDbContext hoặc AddDbContextFactory cùng chuỗi kết nối. Viết JavaScript (A) và dùng tệp HTML tĩnh (C) không liên quan tới truy cập dữ liệu; còn phương án D chỉ nói tới hệ quản trị cơ sở dữ liệu - thứ nằm ở phía máy chủ, không phải cách thêm EF Core vào dự án.
Đáp án đúng: B. Cách kiểm tra dữ liệu chuẩn trong Razor Pages là gắn data annotation lên thuộc tính của PageModel ([Required], [StringLength], [Range], [EmailAddress]...), rồi trong .cshtml dùng các tag helper asp-validation-for và asp-validation-summary để hiển thị lỗi; phía handler kiểm tra ModelState.IsValid trước khi xử lý. Cơ chế này chạy cả phía máy chủ lẫn phía trình duyệt. Chỉ dùng JavaScript (A) là không an toàn vì người dùng có thể bỏ qua; trigger cơ sở dữ liệu (C) quá muộn và sai tầng; thuộc tính HTML tĩnh (D) chỉ là lớp hỗ trợ, không thay được kiểm tra phía máy chủ.
Đáp án đúng: B. Trong Blazor Server, toàn bộ mã C# và cây component chạy TRÊN MÁY CHỦ. Trình duyệt chỉ giữ một kết nối SignalR thường trực, gửi sự kiện người dùng lên máy chủ và nhận về phần chênh lệch của DOM để cập nhật giao diện. Nhờ vậy tải tải về ban đầu rất nhẹ và mã nguồn không lộ ra máy khách, nhưng ứng dụng phụ thuộc vào độ trễ mạng và không chạy được khi mất kết nối. Chạy trong trình duyệt bằng WebAssembly (A) là mô hình của Blazor WebAssembly; C và D mô tả những môi trường không liên quan.
Trong bối cảnh ứng dụng web thời gian thực, "thời gian thực" chủ yếu có nghĩa là gì? Đây là một khái niệm quan trọng trong việc xây dựng các ứng dụng web thời gian thực. Nói một cách đơn giản, "thời gian thực" có nghĩa là dữ liệu được cập nhật ngay lập tức và phản hồi từ máy chủ đến khách hàng cũng phải ngay lập tức. Điều này cho phép người dùng nhận được thông tin mới nhất và cập nhật ngay lập tức, mà không cần phải chờ đợi. Ví dụ, khi bạn gửi một tin nhắn trên ứng dụng thời gian thực, bạn sẽ nhận được phản hồi ngay lập tức, chứ không phải sau một khoảng thời gian chờ đợi. Điều này đòi hỏi các ứng dụng web phải có khả năng xử lý và phản hồi nhanh chóng, để đảm bảo trải nghiệm người dùng tốt nhất.
Đáp án đúng: B. TempData dùng để giữ dữ liệu qua ĐÚNG một lần chuyển hướng, và nơi lưu phụ thuộc vào provider được cấu hình: mặc định trong ASP.NET Core là CookieTempDataProvider - lưu vào cookie đã mã hoá; nếu đăng ký SessionStateTempDataProvider thì dữ liệu nằm trong session state. Vì vậy phát biểu đúng là lưu trong session hoặc cookie tuỳ cấu hình. Phương án A sai vì dữ liệu không chỉ nằm trong bộ nhớ tiến trình; phương án C và D sai vì TempData không ghi xuống cơ sở dữ liệu hay hệ thống tệp.
Đáp án đúng: B. Hệ thống đơn bộ xử lý (mono-processor, còn gọi uniprocessor) là hệ chỉ có MỘT CPU đảm nhiệm toàn bộ việc thực thi lệnh; tại một thời điểm nó chỉ chạy được một luồng lệnh, và cảm giác đa nhiệm có được là nhờ hệ điều hành luân phiên chia thời gian. Hệ nhiều CPU (A) là multi-processor; hệ một CPU nhiều lõi (C) đã có khả năng thực thi song song thật sự nên không còn là mono-processor theo nghĩa cổ điển; hệ phân tán (D) gồm nhiều máy độc lập nối mạng, thuộc phạm trù hoàn toàn khác.
Để bắt đầu kết nối SignalR trên phía client, chúng ta cần sử dụng phương thức start(). Phương thức này được sử dụng để khởi tạo và bắt đầu kết nối với server SignalR. Khi gọi phương thức start(), client sẽ gửi yêu cầu đến server để thiết lập kết nối và bắt đầu truyền thông tin. Phương thức start() là phương thức quan trọng và bắt buộc để bắt đầu sử dụng SignalR trên phía client.
Đáp án đúng: A. Giao diện IHostedService định nghĩa đúng hai phương thức: StartAsync(CancellationToken) được host gọi khi khởi động và StopAsync(CancellationToken) được gọi khi ứng dụng tắt để dịch vụ dọn dẹp và kết thúc êm. Lớp BackgroundService hiện thực hoá sẵn cặp này và cho ta ghi đè ExecuteAsync. Các tên EndAsync(), seAsync() và ShutdownAsync() (B, C, D) không tồn tại trong hợp đồng IHostedService nên đều không phải phương thức dừng dịch vụ.
Đáp án đúng: C. OrderService tự khởi tạo một FileLogger cụ thể bằng new, nghĩa là mô-đun cấp cao phụ thuộc trực tiếp vào lớp hiện thực cấp thấp thay vì vào một trừu tượng như ILogger. Đó chính là vi phạm Nguyên lý Đảo ngược Phụ thuộc; cách sửa là khai báo interface ILogger, cho OrderService nhận nó qua constructor và để DI container cung cấp. Trách nhiệm của OrderService vẫn đơn nhất nên chưa vi phạm SRP (A); không có chỗ nào phải sửa mã cũ để mở rộng nên chưa động tới OCP (B); và cũng không có interface phình to nào để nói tới ISP (D).
Đáp án đúng: B. Nguyên lý Đảo ngược Phụ thuộc phát biểu rằng mô-đun cấp cao và mô-đun cấp thấp đều phải phụ thuộc vào TRỪU TƯỢNG, và trừu tượng không phụ thuộc vào chi tiết mà ngược lại. Mục đích là cắt đứt sự ràng buộc cứng giữa các lớp, giúp thay thế hiện thực, viết kiểm thử với đối tượng giả và mở rộng hệ thống dễ dàng. Phương án A đi ngược mục tiêu vì tạo ra ghép nối chặt; phương án C nói về lớp lớn monolithic, thuộc vấn đề của SRP; phương án D sai hoàn toàn vì DIP dựa chính vào interface.
Hệ thống tên miền (DNS) là một cơ sở dữ liệu phân tán được sử dụng để ánh xạ tên miền vào địa chỉ IP. Khi bạn nhập địa chỉ URL vào trình duyệt, DNS sẽ chuyển đổi tên miền thành địa chỉ IP tương ứng, cho phép thiết bị của bạn kết nối với máy chủ web. Điều này giúp người dùng dễ dàng nhớ và truy cập vào các trang web bằng tên miền dễ đọc hơn so với địa chỉ IP phức tạp.
MessagePack là một định dạng serialize binary được sử dụng để chuyển đổi dữ liệu giữa các ngôn ngữ lập trình khác nhau. Nó được thiết kế để có kích thước nhỏ và tốc độ nhanh chóng, giúp giảm thiểu thời gian truyền dữ liệu qua mạng. MessagePack được sử dụng rộng rãi trong các ứng dụng cần truyền tải dữ liệu nhanh chóng và hiệu quả, chẳng hạn như SignalR, một thư viện truyền thông thực thời gian cho ASP.NET. Nó cũng được sử dụng trong các ứng dụng khác như Node.js và Python. MessagePack có thể serialize các dữ liệu phức tạp như mảng, đối tượng và chuỗi, giúp giảm thiểu thời gian truyền dữ liệu và tăng hiệu suất ứng dụng.
Đáp án đúng: B. Trong Blazor WebAssembly, thời gian chạy .NET được biên dịch sang WebAssembly và tải về trình duyệt, nên toàn bộ mã C# thực thi NGAY TRONG TRÌNH DUYỆT ở phía máy khách. Nhờ vậy ứng dụng chạy được cả khi ngoại tuyến và không tốn kết nối thường trực tới máy chủ, đổi lại tải về ban đầu lớn hơn và mã có thể bị xem xét từ phía người dùng. Chạy trên máy chủ (A) là mô hình Blazor Server; C và D mô tả những môi trường thực thi không đúng với Blazor WebAssembly.
Câu hỏi này yêu cầu bạn chọn file extension phù hợp cho các file Razor Page. Razor Page là một loại file trong ASP.NET Core, được sử dụng để tạo các trang web động. Câu trả lời đúng là .cshtml, vì nó là file extension tiêu chuẩn cho các file Razor Page. Các file .cshtml chứa mã C# và HTML, giúp tạo ra các trang web động phức tạp. Các file .razor cũng có thể được sử dụng, nhưng nó không phải là file extension mặc định. Các file .aspx và .html không phù hợp cho các file Razor Page.
Một URI (Uniform Resource Identifier) chủ yếu được sử dụng để xác định một tài nguyên trên internet hoặc mạng LAN. Nó cung cấp một cách duy nhất để truy cập và tham chiếu đến tài nguyên này. Ví dụ, một URI có thể được sử dụng để truy cập một trang web, một tệp tin hoặc một dịch vụ mạng. URI giúp người dùng và máy tính xác định vị trí và tính chất của tài nguyên, từ đó có thể thực hiện các hành động như tải xuống, xem hoặc sử dụng tài nguyên đó. Trong khi các lựa chọn khác như truyền tệp tin, mã hóa dữ liệu và định nghĩa tốc độ mạng hardware không liên quan trực tiếp đến chức năng chính của URI.
Trong SignalR, Hub filters là các thành phần trung gian có thể chặn và sửa đổi các phương thức hub. Chúng cho phép bạn thực hiện các hành động trước và sau khi gọi phương thức hub, chẳng hạn như xác thực người dùng, kiểm tra quyền truy cập, hoặc thậm chí là thay đổi dữ liệu được gửi qua mạng. Hub filters hoạt động như các lớp trung gian giữa các phương thức hub và các phương thức thực thi, cho phép bạn tách biệt logic kinh doanh khỏi logic mạng. Điều này giúp bạn dễ dàng quản lý và bảo trì các ứng dụng SignalR phức tạp hơn.
Đáp án đúng: C. async/await trong C# được xây trên Task-based Asynchronous Pattern: một phương thức bất đồng bộ trả về Task hoặc Task<T>, và await tạm dừng phương thức cho tới khi Task hoàn tất mà không chặn luồng. TAP ra đời từ .NET 4 và là mẫu được khuyến nghị hiện nay. Event-based Asynchronous Pattern (A) là mẫu cũ dùng cặp phương thức MethodAsync kèm sự kiện MethodCompleted; Asynchronous Programming Model (B) là mẫu còn cũ hơn với cặp BeginXxx/EndXxx và IAsyncResult; mẫu delegate (D) không phải một mô hình bất đồng bộ chuẩn.
Trong Blazor, [Parameter] là một thuộc tính quan trọng được sử dụng để định nghĩa một thuộc tính có thể được thiết lập từ một thành phần cha. Khi một thành phần con sử dụng [Parameter], nó cho phép thành phần cha truyền giá trị cho thuộc tính đó. Điều này giúp tăng cường khả năng tương tác giữa các thành phần trong ứng dụng Blazor. Ví dụ, nếu bạn có một thành phần cha chứa một danh sách dữ liệu và muốn truyền danh sách đó cho thành phần con để hiển thị, bạn có thể sử dụng [Parameter] để định nghĩa thuộc tính nhận danh sách dữ liệu. Điều này giúp giảm thiểu mã nguồn và tăng cường khả năng tái sử dụng.
Để xác minh hai thuộc tính trong một mô hình khớp nhau, bạn cần sử dụng thuộc tính [Compare]. Ví dụ, khi bạn muốn đảm bảo rằng mật khẩu và xác nhận mật khẩu phải trùng nhau, bạn có thể sử dụng [Compare] để thực hiện việc này. Ngoài ra, [Compare] cũng có thể được sử dụng để xác minh các thuộc tính khác như email hoặc số điện thoại.
Đáp án đúng: D. Cả ViewBag lẫn ViewData đều KHÔNG phải kiểu mạnh. ViewData là ViewDataDictionary, tức từ điển chuỗi - object, nên khi lấy ra phải ép kiểu như @((int)ViewData["Number"]) và lỗi ép kiểu chỉ lộ ra lúc chạy. ViewBag chỉ là lớp bọc dynamic quanh chính ViewData, nhờ dynamic mà viết @ViewBag.Text không cần ép kiểu nhưng cũng không được trình biên dịch kiểm tra. Vì vậy A, B và C đều sai khi gán nhãn "strongly typed" cho một trong hai. Muốn kiểu mạnh thì phải dùng view model với chỉ thị @model.
Dịch vụ EmailWorker được triển khai dựa trên lớp BackgroundService trong C#. Lớp này thực hiện việc gửi email một cách lặp đi lặp lại. Trong phương thức ExecuteAsync, dịch vụ này sẽ tiếp tục gửi email cho đến khi nhận được tín hiệu hủy bỏ. Trong mỗi vòng lặp, dịch vụ sẽ gọi phương thức SendEmails để gửi email và sau đó chờ 1 phút trước khi tiếp tục. Điều này cho thấy dịch vụ sẽ gửi email mỗi phút một lần.
Đáp án đúng: D. Khi nhiều luồng cùng đọc và ghi lên một vùng dữ liệu chia sẻ mà không có cơ chế đồng bộ như lock, Monitor, Interlocked hay các bộ sưu tập concurrent, thì thứ tự thao tác trở nên bất định và sinh ra data race: kết quả sai lệch, thay đổi giữa các lần chạy và rất khó tái hiện khi gỡ lỗi. Đó là rủi ro nghiêm trọng nhất của lập trình song song. Tăng bộ nhớ (A) chỉ là chi phí phụ; giảm băng thông mạng (B) không liên quan; và gỡ lỗi trở nên KHÓ hơn chứ không đơn giản hơn nên C sai hẳn.
Để tạo một View được định nghĩa rõ ràng (strongly-typed View), bạn cần sử dụng một trong các chỉ thị sau. Trong đó, chỉ thị '@model' được sử dụng rộng rãi nhất để khai báo kiểu dữ liệu của View. Ví dụ, nếu bạn muốn tạo một View để hiển thị thông tin về một người dùng, bạn có thể sử dụng '@model' để khai báo kiểu dữ liệu là 'User'. Điều này giúp cho View của bạn được định nghĩa rõ ràng và dễ dàng sử dụng.
SignalR Hubs là một công cụ quan trọng trong việc xây dựng các ứng dụng thời gian thực (real-time application) bằng cách cung cấp một cách để các máy khách (client) và máy chủ (server) giao tiếp với nhau. Nó cho phép các máy khách kết nối đến máy chủ và nhận thông tin cập nhật ngay lập tức, đồng thời cũng cho phép các máy chủ gửi thông tin đến các máy khách. Điều này rất hữu ích trong các ứng dụng như trò chơi trực tuyến, ứng dụng thời gian thực, và các ứng dụng cần cập nhật dữ liệu ngay lập tức.
Đáp án đúng: B. Hệ đa bộ xử lý là hệ thống có từ hai CPU trở lên cùng chia sẻ bộ nhớ và hệ điều hành, nhờ đó nhiều luồng lệnh thực sự chạy đồng thời chứ không chỉ luân phiên chia thời gian. Đây là nền tảng phần cứng cho lập trình song song với Task Parallel Library hay Parallel.For trong .NET. Hệ một lõi CPU (A) chính là mono-processor; hệ chỉ có một luồng (C) nói về mô hình thực thi phần mềm chứ không phải cấu hình phần cứng; và việc có hay không kết nối mạng (D) hoàn toàn không liên quan tới số bộ xử lý.