PRN232Chưa đoKỳ 8Chuyên ngành Cập nhật 28/07/2026

PRN232 - Xây dựng ứng dụng back-end đa nền tảng với .NET

PRN232 - Xây dựng ứng dụng back-end đa nền tảng với .NET là môn học xây dựng RESTful Web API bằng C# 12 và .NET 8 trên nền ASP.NET Core. Ngân hàng câu hỏi trắc nghiệm PRN232 có giải thích bao quát trọn bộ chương trình: nhập môn ASP.NET Core và RESTful Service (ràng buộc REST, tính phi trạng thái, giao thức HTTP, request line, mã trạng thái 200 OK, Kestrel, Swagger và OpenAPI, MapControllers, middleware trong Program.cs), Models trong Web API với Entity Framework Core (DbContext, DbSet, LINQ và ToListAsync, POCO, Repository Pattern, Data Transfer Object, AutoMapper, tránh trả thẳng entity ra client), Media Formatters và Content Negotiation (InputFormatter và OutputFormatter, TextInputFormatter, header Accept và Content-Type, hệ số ưu tiên q, application/json, application/xml, text/csv, serialization và deserialization), Binding - Validation - Routing (Model Binder, binding source parameter inference, FromBody, FromQuery, FromRoute, FromHeader, attribute routing, tham số route, Data Annotations với Required, StringLength, EmailAddress, RegularExpression, ApiController và ModelState.IsValid, trả về 400 Bad Request và NotFound), OData trong ASP.NET Core Web API (gói Microsoft.AspNetCore.OData, ODataConventionModelBuilder, Entity Data Model, Entity Set, các tuỳ chọn truy vấn $filter, $select, $expand, $orderby, $count, $skip, $top, endpoint $metadata, hàm endswith), bảo mật RESTful Web Service (ASP.NET Core Identity, JSON Web Token với ba phần Header - Payload - Signature, UseAuthentication và UseAuthorization, header Authorization dạng Bearer, thuộc tính Authorize theo Roles, HTTPS, xác thực và phân quyền), JavaScript Client và AJAX (jQuery, cú pháp $(selector).action(), $.ajax, $.get, $.post, phương thức .on() và event delegation, Same-Origin Policy, CORS, JSON hợp lệ, XML well-formed), xây dựng dịch vụ với WCF và CoreWCF (ServiceContract, OperationContract, endpoint ABC gồm Address - Binding - Contract, AddServiceModelServices, host trong ASP.NET Core dưới dạng middleware) và gRPC Service (Protocol Buffers, file .proto, HTTP/2, GrpcChannel, ServerCallContext, streaming hai chiều, Server Push), khép lại bằng kiến trúc Microservices (API Gateway, Ocelot, Docker, giao tiếp đồng bộ và bất đồng bộ, cơ sở dữ liệu riêng cho từng service, runtime coupling). Tài liệu ôn thi FE dành cho sinh viên FPT University.

115Câu hỏi
3Bộ đề
10Chủ đề
5,01 đánh giá

Câu hỏi của môn

64/115 câuCòn 51
ATo define the database connection string.
BTo enforce validation rules for the model's data.
CTo specify the controller that uses the model.
DTo add comments to the code for documentation.
Lời giải
Trong ASP.NET Core, các chú thích dữ liệu (Data Annotations) như [Required] và [StringLength] được sử dụng để định nghĩa các quy tắc xác thực cho dữ liệu của mô hình. Những chú thích này cho phép bạn xác định các yêu cầu bắt buộc và giới hạn độ dài cho các thuộc tính của mô hình. Ví dụ, bạn có thể sử dụng [Required] để yêu cầu một thuộc tính không được để trống, hoặc [StringLength] để giới hạn độ dài của một chuỗi. Những quy tắc này sẽ được áp dụng khi bạn tạo hoặc cập nhật dữ liệu cho mô hình, giúp đảm bảo rằng dữ liệu luôn được hợp lệ và chính xác. Ngoài ra, những chú thích này cũng giúp bạn dễ dàng xác định và sửa lỗi các vấn đề liên quan đến dữ liệu không hợp lệ.
Mở trang câu hỏi này →
A500 Internal Server Error
B404 Not Found
C400 Bad Request
D200 OK
Lời giải
Khi người dùng cung cấp dữ liệu không hợp lệ trong cơ thể yêu cầu, trạng thái HTTP phù hợp nhất để trả về là trạng thái lỗi yêu cầu không hợp lệ. Điều này xảy ra khi máy chủ nhận được yêu cầu nhưng không thể xử lý do dữ liệu không hợp lệ. Trạng thái lỗi này cho biết yêu cầu không hợp lệ và yêu cầu người dùng cung cấp dữ liệu hợp lệ. Ví dụ, khi người dùng nhập sai địa chỉ email hoặc mật khẩu, trạng thái lỗi này sẽ được trả về.
Mở trang câu hỏi này →
A[Email]
B[IsEmail]
C[EmailAddress]
D[RegularExpression(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$")]
Lời giải
Để xác định một thuộc tính là một địa chỉ email hợp lệ, bạn cần sử dụng thuộc tính [EmailAddress]. Đây là thuộc tính được sử dụng để xác minh rằng giá trị nhập vào có đúng định dạng email. Ví dụ, khi bạn nhập vào địa chỉ email như 'example@gmail.com', thuộc tính [EmailAddress] sẽ xác nhận rằng nó có đúng định dạng và không có lỗi. Ngoài ra, bạn cũng có thể sử dụng thuộc tính [IsEmail] để thực hiện chức năng tương tự, nhưng [EmailAddress] là lựa chọn phổ biến hơn và được sử dụng rộng rãi trong các ứng dụng.
Mở trang câu hỏi này →
AModel Binding
BData Seeding
CDependency Injection
DMiddleware Mapping
Lời giải
Trong khi xây dựng ứng dụng Web API, việc liên kết dữ liệu JSON đến mô hình dữ liệu là một bước quan trọng. Có nhiều phương pháp có thể được sử dụng để thực hiện việc này, nhưng phương pháp phổ biến nhất là Model Binding. Model Binding cho phép tự động liên kết dữ liệu JSON đến các thuộc tính của mô hình dữ liệu dựa trên tên và loại dữ liệu. Điều này giúp giảm thiểu mã nguồn và tăng cường hiệu suất của ứng dụng. Ngoài ra, Model Binding cũng hỗ trợ các tính năng như kiểm tra dữ liệu và xử lý lỗi, giúp đảm bảo rằng dữ liệu được liên kết chính xác và an toàn.
Mở trang câu hỏi này →
AGET /Categories(1)?$select=Products
BGET /Categories(1)?$expand=Products
CGET /Categories(1),/Products
DGET /Categories(1)/Products?$fetch=all
Lời giải
Để lấy một đối tượng Category và tất cả các đối tượng Product liên quan trong một yêu cầu, bạn cần sử dụng truy vấn OData phù hợp. Trong trường hợp này, bạn có thể sử dụng truy vấn GET /Categories(1)?$expand=Products. Điều này cho phép bạn lấy một đối tượng Category với ID là 1 và tất cả các đối tượng Product liên quan. Cụ thể, $expand là một tham số trong OData cho phép bạn lấy các đối tượng liên quan trong một yêu cầu. Ví dụ, GET /Categories(1)?$expand=Products sẽ trả về một đối tượng Category với ID là 1 và tất cả các đối tượng Product liên quan.
Mở trang câu hỏi này →
ACount the number of properties on an entity.
BRetrieve the total number of items in a collection, often alongside the data itself.
CLimit the number of results returned.
DCount the number of related entities.
Lời giải
Tùy chọn truy vấn $count được sử dụng để lấy tổng số lượng mục trong một tập hợp, thường đi kèm với dữ liệu chính.
Mở trang câu hỏi này →
Đề bài
var builder = new ODataConventionModelBuilder();
builder.EntitySet<Product>("Products");
builder.EntitySet<Category>("Categories");
return builder.GetEdmModel();
AIt creates two entity sets, Products and Categories, and infers their properties and relationships by convention from the C# classes.
BIt defines two complex types that cannot be queried directly.
CIt creates an empty model and waits for the database to provide the schema.
DIt registers two controllers named Products and Categories.
Lời giải
Mã code sử dụng ODataModelBuilder để xây dựng EDM (Entity Data Model). Nó tạo ra hai tập hợp thực thể, Products và Categories, và tự động xác định các thuộc tính và mối quan hệ của chúng dựa trên các lớp C#. Điều này có nghĩa là khi bạn tạo một lớp C# để mô hình hóa một thực thể, ODataModelBuilder sẽ tự động tạo ra các tập hợp thực thể tương ứng và xác định các thuộc tính và mối quan hệ của chúng. Điều này giúp giảm thiểu công việc thủ công khi xây dựng EDM và tạo điều kiện thuận lợi cho việc phát triển ứng dụng dựa trên dữ liệu.
Mở trang câu hỏi này →
A/$metadata
B/$help
C/$schema
D/$info
Lời giải
Endpoints của một dịch vụ OData thường được sử dụng để truy cập dữ liệu. Để biết thông tin chi tiết về cấu trúc dữ liệu của dịch vụ, chúng ta cần truy cập vào endpoint nào? Dưới đây là một số lựa chọn.
Mở trang câu hỏi này →
AGET
BPUT
CPOST
DMERGE
Lời giải
Để tạo một thực thể mới trong một dịch vụ OData, bạn cần sử dụng phương thức HTTP nào?
Mở trang câu hỏi này →
54To delete a product with an ID of 123, which OData request is correct?4 lựa chọnTrung bình67% trả lời đúng
APOST /Products?$filter=Id eq 123
BDELETE /Products(123)
CGET /Products(123)?action=delete
DREMOVE /Products/123
Lời giải
Để xóa một sản phẩm có ID là 123, chúng ta cần sử dụng phương thức HTTP phù hợp. Trong OData, phương thức HTTP để xóa một tài nguyên là DELETE. Khi sử dụng DELETE, chúng ta cần cung cấp đường dẫn đến tài nguyên cần xóa. Trong trường hợp này, đường dẫn đến sản phẩm có ID là 123 là /Products(123). Vì vậy, câu trả lời đúng là DELETE /Products(123).
Mở trang câu hỏi này →
55What is an "Entity Set"?4 lựa chọnDễ100% trả lời đúng
AThe set of properties that make up an entity's key.
BA named collection of entities of a specific Entity Type, like Products being a collection of Product entities.
CThe schema version of the data model.
DA set of validation rules for an entity.
Lời giải
Một tập hợp các thực thể của một loại thực thể cụ thể, chẳng hạn như Products là một tập hợp các thực thể Product. Tập hợp thực thể này được xác định bởi tên và chứa các thực thể có thuộc tính tương tự. Ví dụ, nếu bạn có một tập hợp thực thể Product, thì mỗi thực thể trong tập hợp này đều có thuộc tính như tên sản phẩm, giá cả, mô tả, v.v. Tập hợp thực thể này giúp bạn quản lý và truy cập các thực thể một cách hiệu quả. Nó cũng giúp bạn thực hiện các hoạt động như thêm, sửa, xóa thực thể một cách dễ dàng và thống nhất.
Mở trang câu hỏi này →
ATo define the visual layout of web pages.
BTo provide a standardized, REST-based protocol for creating and consuming queryable and interoperable APIs.
CTo replace the TCP/IP networking stack.
DTo serve as a client-side JavaScript framework for building single-page applications.
Lời giải
OData (Open Data Protocol) là một giao thức tiêu chuẩn hóa, dựa trên REST (Representational State of Resource), được thiết kế để tạo và tiêu thụ các API (Application Programming Interface) có thể được truy vấn và tương thích. Giao thức này cho phép các ứng dụng và dịch vụ chia sẻ dữ liệu một cách dễ dàng và thống nhất. OData cung cấp các tính năng như khả năng truy vấn dữ liệu, cập nhật dữ liệu, và quản lý các mối quan hệ giữa các đối tượng dữ liệu. Điều này giúp tạo ra các API có thể được sử dụng bởi các ứng dụng và dịch vụ khác nhau, bất kể nền tảng hoặc ngôn ngữ lập trình của chúng.
Mở trang câu hỏi này →
AMicrosoft.AspNetCore.OData
BMicrosoft.EntityFrameworkCore.SqlServer
CMicrosoft.AspNetCore.Mvc.Razor
DMicrosoft.AspNetCore.Authentication.JwtBearer
Lời giải
Để bật hỗ trợ OData trong ASP.NET Core Web API, bạn cần sử dụng gói NuGet Microsoft.AspNetCore.OData. Gói này cung cấp các tính năng cần thiết để tạo và quản lý các nguồn dữ liệu OData. OData là một tiêu chuẩn mở cho việc truy cập và quản lý dữ liệu trên web, cho phép bạn tạo các nguồn dữ liệu có thể được truy cập và sử dụng bởi các ứng dụng khác nhau. Khi sử dụng Microsoft.AspNetCore.OData, bạn có thể tạo các nguồn dữ liệu OData và sử dụng các tính năng như truy vấn dữ liệu, tạo và cập nhật dữ liệu, v.v. Ngoài ra, gói này cũng cung cấp các tính năng bảo mật và quản lý quyền truy cập dữ liệu.
Mở trang câu hỏi này →
A$select
B$orderby
C$expand
D$skip
Lời giải
Để chọn chỉ những thuộc tính cụ thể của một tài nguyên trong OData, bạn cần sử dụng tùy chọn '$select'. Tùy chọn này cho phép bạn chọn những thuộc tính mà bạn muốn lấy từ một tài nguyên, giúp giảm thiểu số lượng dữ liệu được truyền tải và cải thiện hiệu suất. Ví dụ, nếu bạn muốn lấy chỉ tên và địa chỉ của một khách hàng, bạn có thể sử dụng tùy chọn '$select' như sau: GET /Customers?$select=Name,Address Tùy chọn '$select' rất hữu ích khi bạn cần lấy một số thuộc tính cụ thể của một tài nguyên, giúp bạn có thể tập trung vào những thông tin quan trọng và giảm thiểu thời gian tải dữ liệu.
Mở trang câu hỏi này →
AGET /Products?$filter=endswith(Name, 'Edition')
BGET /Products?$filter=Name.endsWith('Edition')
CGET /Products?$filter=last(Name) eq 'Edition'
DGET /Products?$filter=Name like '%Edition'
Lời giải
Để tìm kiếm tất cả các sản phẩm có tên kết thúc bằng chuỗi 'Edition', chúng ta cần sử dụng hàm 'endswith' trong truy vấn OData. Hàm này giúp chúng ta kiểm tra xem chuỗi nào kết thúc bằng chuỗi khác. Trong trường hợp này, chúng ta muốn tìm kiếm các sản phẩm có tên kết thúc bằng 'Edition'.
Mở trang câu hỏi này →
A$select
B$orderby
C$filter
D$top
Lời giải
Để lọc một tập hợp các tài nguyên trong một yêu cầu OData, bạn cần sử dụng hệ thống câu lệnh truy vấn có tên là '$filter'. Câu lệnh '$filter' cho phép bạn áp dụng các điều kiện lọc để chọn ra các tài nguyên phù hợp với yêu cầu của bạn. Ví dụ, bạn có thể sử dụng '$filter' để lọc các tài nguyên dựa trên các thuộc tính của chúng, chẳng hạn như tên, địa chỉ, hoặc ngày sinh. Điều này giúp bạn có thể tập trung vào các tài nguyên quan trọng và giảm thiểu số lượng dữ liệu không cần thiết.
Mở trang câu hỏi này →
AHeader, Payload, Signature
BPayload, Header, Signature
CSignature, Header, Payload
DHeader, Signature, Body
Lời giải
Một JWT (JSON Web Token) được cấu tạo bởi ba phần được ngăn cách bởi dấu chấm (.). Để xác định thứ tự chính xác của các phần này, chúng ta cần hiểu rõ về chức năng của từng phần. Phần đầu tiên là Header, chứa thông tin về thuật toán được sử dụng để tạo chữ ký và loại token. Phần thứ hai là Payload, chứa dữ liệu thực tế được truyền tải trong token, bao gồm thông tin về người dùng, quyền truy cập, v.v. Phần thứ ba là Signature, chứa chữ ký được tạo bằng cách sử dụng Header và Payload. Chữ ký này giúp xác minh tính toàn vẹn và tính xác thực của token. Vì vậy, thứ tự chính xác của các phần trong một JWT là Header, Payload, Signature.
Mở trang câu hỏi này →
AYes, because the user has one of the required roles.
BNo, because the user must have both the "Editor" and "Admin" roles.
CYes, because the comma indicates an OR relationship.
DIt depends on which role was assigned first.
Lời giải
Khi một người dùng có nhiều vai trò, chẳng hạn như "Biên tập viên" và "Tác giả", và một hành động được trang trí với [Authorize(Roles = "Biên tập viên,Admin")]. Người dùng có được truy cập không?
Mở trang câu hỏi này →
ABy modifying the IdentityUser source code directly.
BBy creating a new class that inherits from IdentityUser and adding the new properties to it.
CBy storing the extra data in a separate, manually-managed table.
DIt is not possible to extend the IdentityUser model.
Lời giải
Để thêm thuộc tính tùy chỉnh (ví dụ: FirstName, DateOfBirth) vào mô hình người dùng trong ASP.NET Core Identity, bạn có thể tạo một lớp mới kế thừa từ IdentityUser và thêm các thuộc tính mới vào đó. Điều này cho phép bạn mở rộng mô hình người dùng mà không cần phải sửa đổi mã nguồn của IdentityUser trực tiếp. Khi tạo lớp mới, bạn cần đảm bảo rằng lớp này có cùng tên với lớp IdentityUser và có cùng thuộc tính khóa chính (ví dụ: Id). Sau đó, bạn có thể thêm các thuộc tính mới vào lớp này, chẳng hạn như FirstName và DateOfBirth. Lớp mới này sẽ được sử dụng thay thế cho lớp IdentityUser trong mô hình người dùng của bạn.
Mở trang câu hỏi này →
A[RequiresRole("Administrator")]
B[Authorize(Role = "Administrator")]
C[Authorize(Roles = "Administrator")]
D[Authorize(UserRole = "Administrator")]
Lời giải
Để hạn chế truy cập vào một hành động controller chỉ cho người dùng có vai trò "Administrator", bạn có thể sử dụng một trong các cách sau. Cách 1: Sử dụng [Authorize(Roles = "Administrator")] - Đây là cách phổ biến và được sử dụng rộng rãi trong các ứng dụng ASP.NET. Cách 2: Sử dụng [RequiresRole("Administrator")] - Đây là cách khác để hạn chế truy cập vào một hành động controller. Cách 3: Sử dụng [Authorize(UserRole = "Administrator")] - Đây là cách khác để hạn chế truy cập vào một hành động controller, mặc dù cách này không được sử dụng rộng rãi như cách 1. Cách 4: Sử dụng [Authorize(Role = "Administrator")] - Đây là cách khác để hạn chế truy cập vào một hành động controller, mặc dù cách này không được sử dụng rộng rãi như cách 1.
Mở trang câu hỏi này →