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

44/115 câuCòn 71
ANon-browser clients never send an Accept header.
BBrowsers often send a very broad Accept header (e.g., text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, */*;q=0.8) because they can handle many types.
CBrowsers only accept text/html.
DNon-browser clients are required to accept application/json only.
Lời giải
Một trong những khác biệt chính trong cách các trình duyệt web và các khách hàng HTTP không phải trình duyệt (như HttpClient trong C# hoặc Postman) thường thiết lập tiêu đề Accept là gì? Các trình duyệt web thường gửi tiêu đề Accept rất rộng (ví dụ: text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, */*;q=0.8) vì chúng có thể xử lý nhiều loại dữ liệu. Điều này cho phép các trang web gửi lại dữ liệu trong nhiều định dạng khác nhau mà trình duyệt có thể hiểu được. Ngược lại, các khách hàng HTTP không phải trình duyệt thường chỉ gửi tiêu đề Accept cho một hoặc một số loại dữ liệu cụ thể mà chúng cần. Ví dụ, một ứng dụng C# có thể chỉ cần nhận dữ liệu JSON, vì vậy nó sẽ gửi tiêu đề Accept với giá trị application/json. Điều này giúp giảm thiểu số lượng dữ liệu cần xử lý và tăng tốc độ tải trang.
Mở trang câu hỏi này →
26What is serialization in the context of a Web API?4 lựa chọnDễ100% trả lời đúng
AThe process of converting a .NET object into a format (like JSON or XML) that can be transmitted over the network.
BThe process of converting a format (like JSON or XML) from a request into a .NET object.
CThe process of handling requests in a specific, sequential order.
DThe process of securing data before transmission.
Lời giải
Serialization trong bối cảnh của một Web API là quá trình chuyển đổi một đối tượng .NET thành một định dạng (như JSON hoặc XML) có thể được truyền qua mạng. Quá trình này rất quan trọng vì nó cho phép dữ liệu được truyền qua mạng một cách hiệu quả và an toàn. Khi một ứng dụng Web API nhận được yêu cầu, nó sẽ sử dụng serialization để chuyển đổi dữ liệu thành một định dạng có thể được truyền qua mạng. Sau đó, dữ liệu này sẽ được truyền qua mạng đến máy chủ hoặc thiết bị khác. Khi dữ liệu đến được đích, ứng dụng Web API sẽ sử dụng deserialization để chuyển đổi dữ liệu trở lại thành một đối tượng .NET có thể được sử dụng bởi ứng dụng.
Mở trang câu hỏi này →
ATo convert data between different media types like JSON and XML
BTo manage routing rules for controllers
CTo handle authentication and authorization
DTo log requests and responses
Lời giải
Trong ASP.NET Core Web API, mục đích của các trình định dạng phương tiện (media formatters) là chuyển đổi dữ liệu giữa các loại phương tiện khác nhau như JSON và XML. Các trình định dạng phương tiện này giúp cho các ứng dụng web API có thể trả về dữ liệu dưới dạng phù hợp với yêu cầu của khách hàng. Ví dụ, nếu khách hàng yêu cầu dữ liệu dưới dạng JSON, trình định dạng phương tiện sẽ chuyển đổi dữ liệu từ dạng XML sang JSON. Điều này giúp cho ứng dụng web API có thể tương tác với các ứng dụng khác nhau mà không cần phải thay đổi mã nguồn. Các trình định dạng phương tiện cũng có thể được sử dụng để chuyển đổi dữ liệu giữa các định dạng khác nhau như XML, JSON, CSV, v.v.
Mở trang câu hỏi này →
28Which of the following is a correctly formatted Media Type for JSON?4 lựa chọnTrung bình67% trả lời đúng
Atext/json
Bapplication/json
Cdata/json
Djson/application
Lời giải
Loại định dạng Media Type cho JSON được sử dụng rộng rãi và được khuyến nghị là 'application/json'. Loại này được sử dụng để xác định rằng dữ liệu được gửi hoặc nhận là trong định dạng JSON. Ví dụ, khi gửi yêu cầu HTTP, bạn có thể sử dụng 'Content-Type: application/json' để chỉ định rằng dữ liệu được gửi là trong định dạng JSON. Ngoài ra, khi nhận dữ liệu, bạn có thể sử dụng 'Accept: application/json' để chỉ định rằng bạn muốn nhận dữ liệu trong định dạng JSON. Loại định dạng này được hỗ trợ bởi hầu hết các trình duyệt và ứng dụng web, vì vậy nó là lựa chọn tốt nhất cho việc gửi và nhận dữ liệu JSON.
Mở trang câu hỏi này →
ACsvFormatter
BTextOutputFormatter
CTextInputFormatter
DOutputFormatter
Lời giải
Để tạo một trình định dạng đầu vào tùy chỉnh cho loại phương tiện text/csv, bạn cần kế thừa từ lớp cơ sở nào?
Mở trang câu hỏi này →
Đề bài
public ActionResult<Product> GetProduct(int id) {
  var product = _productService.GetById(id);
  if (product == null) {
    return ???;
    // What should be here?
  }
  return product;
}
AOk()
BNotFound()
CBadRequest()
DNoContent()
Mở trang câu hỏi này →
A[FromQuery]
B[FromBody]
C[FromRoute]
D[FromHeader]
Lời giải
Theo các quy tắc suy luận, bất kỳ tham số kiểu phức tạp nào không được đăng ký trong hộp chứa DI và không khớp với tham số đường dẫn sẽ được suy luận đến từ đâu?
Mở trang câu hỏi này →
AFrom the query string.
BFrom the request body.
CFrom the route data.
DFrom the request headers.
Lời giải
Khi sử dụng [ApiController] trong ASP.NET Core, model binder sẽ cố gắng lấy dữ liệu cho tham số kiểu phức tạp (như một lớp hoặc bản ghi) từ đâu? Theo mặc định, model binder sẽ lấy dữ liệu từ cơ thể yêu cầu (request body). Điều này có nghĩa là dữ liệu sẽ được gửi qua trong nội dung của yêu cầu HTTP, thường là dưới dạng JSON hoặc XML. Điều này giúp cho việc truyền dữ liệu phức tạp trở nên dễ dàng hơn và giúp cho việc xử lý dữ liệu trở nên linh hoạt hơn. Tuy nhiên, người dùng cũng có thể sử dụng các thuộc tính khác nhau để chỉ định nguồn dữ liệu cho model binder, chẳng hạn như [FromBody], [FromQuery] hoặc [FromRoute].
Mở trang câu hỏi này →
Aapp.MapControllers();
Bapp.UseControllerRouting();
Capp.EnableControllerSupport();
Dapp.UseStaticFiles();
Lời giải
Trong một ứng dụng Web API truyền thống dựa trên controller trong .NET 8/9, phương thức gọi trong Program.cs quan trọng nhất cho việc định tuyến đến các controller là app.MapControllers(). Phương thức này cho phép ứng dụng nhận biết và xử lý các yêu cầu HTTP đến các controller. Khi bạn gọi app.MapControllers(), bạn đang cho phép ứng dụng .NET sử dụng tính năng routing mặc định để định tuyến các yêu cầu đến các controller phù hợp. Điều này giúp bạn có thể sử dụng các controller để xử lý các yêu cầu HTTP và trả về các phản hồi phù hợp.
Mở trang câu hỏi này →
AQuery string parameters
BRoute parameters
CRequest headers
DForm data fields
Lời giải
Trong câu hỏi này, chúng ta được hỏi về cách định nghĩa tham số trong đường dẫn (route) của một API. Đường dẫn được định nghĩa trong câu lệnh [HttpGet("users/{userId}/orders/{orderId}")].
Mở trang câu hỏi này →
AOnly in the request body.
BIn the route data, then the query string, then form data.
COnly in the request headers.
DIt will not look anywhere and will throw an exception.
Lời giải
Khi thực hiện hành động Get với phương thức public IActionResult Get(int id), và không có bất kỳ thuộc tính nào khác, thì bộ gắn model sẽ tìm kiếm giá trị của id theo mặc định ở đâu? Bộ gắn model sẽ tìm kiếm giá trị của id ở dữ liệu route (dữ liệu đường dẫn), sau đó là query string (dữ liệu tham số trong URL), và cuối cùng là dữ liệu form (dữ liệu được gửi qua form). Điều này là do ASP.NET Core sử dụng một bộ gắn model mặc định để gắn giá trị vào các thuộc tính của controller. Bộ gắn model này sẽ ưu tiên tìm kiếm giá trị trong dữ liệu route, sau đó là query string, và cuối cùng là dữ liệu form. Điều này giúp cho việc gắn model trở nên dễ dàng và linh hoạt hơn.
Mở trang câu hỏi này →
AManually checking ModelState.IsValid in every action.
BThe [ApiController] attribute automatically handles it.
CUsing a custom middleware to inspect every request.
DRelying on the database to throw an exception.
Lời giải
Trong một ứng dụng Web API .NET 8, cách xử lý lỗi xác thực mô hình tự động và trả về trạng thái 400 Bad Request được khuyến nghị như sau. Trước đây, để kiểm tra lỗi xác thực mô hình, chúng ta thường phải kiểm tra trạng thái `ModelState.IsValid` trong mỗi hành động. Tuy nhiên, từ .NET 6 trở lên, khi áp dụng tính năng API Controller, việc xử lý lỗi xác thực mô hình đã được tự động hóa. Khi áp dụng tính năng này, khi có lỗi xác thực mô hình, hệ thống sẽ tự động trả về trạng thái 400 Bad Request cùng với thông tin lỗi. Điều này giúp giảm thiểu mã nguồn và tăng cường tính bảo mật cho ứng dụng.
Mở trang câu hỏi này →
AThe action method still executes as normal.
BAn HTTP 500 Internal Server Error is returned.
CThe request is automatically rejected with an HTTP 400 Bad Request response containing details of the validation errors.
DThe application logs the error and returns an HTTP 200 OK.
Lời giải
Khi một controller được trang bị [ApiController], nếu ModelState.IsValid là false, điều gì sẽ xảy ra tự động? Điều này có nghĩa là khi bạn gửi một yêu cầu đến controller và dữ liệu yêu cầu không hợp lệ, hệ thống sẽ tự động trả về một phản hồi HTTP 400 Bad Request. Phản hồi này sẽ chứa chi tiết về các lỗi xác thực. Điều này giúp người dùng biết rõ về các lỗi mà họ đã mắc phải và có thể sửa đổi dữ liệu yêu cầu một cách chính xác. Ngoài ra, hệ thống cũng sẽ không thực hiện hành động nào khác, vì ModelState.IsValid là điều kiện tiên quyết để thực hiện hành động. Vì vậy, nếu ModelState.IsValid là false, hệ thống sẽ tự động trả về phản hồi HTTP 400 Bad Request và dừng lại.
Mở trang câu hỏi này →
Đề bài
app.MapGet("/products/{id}", (int id) => {
  // Logic to find a product by id return Results.Ok($"Product {id
}
"); }

);

AIt defines an endpoint that creates a new product.
BIt defines an endpoint that retrieves a product by its ID using a POST request.
CIt defines an endpoint that retrieves a product by its ID using a GET request.
DIt defines an endpoint that deletes a product by its ID.
Lời giải
Mã nguồn C# này tạo một endpoint trong ứng dụng .NET. Endpoint này được định nghĩa bằng cách sử dụng phương thức MapGet. Phương thức này cho phép tạo một endpoint có thể được truy cập bằng phương thức GET. Trong trường hợp này, endpoint được định nghĩa tại đường dẫn /products/{id}, nơi {id} là một tham số được truyền vào. Tham số này được định nghĩa bằng cách sử dụng toán tử (int id), điều này cho phép chỉ chấp nhận giá trị là số nguyên. Logic bên trong endpoint này là tìm một sản phẩm dựa trên ID được truyền vào. Sau khi tìm thấy sản phẩm, endpoint sẽ trả về một phản hồi có trạng thái OK và nội dung là chuỗi 'Sản phẩm {id}'. Điều này cho thấy endpoint này được sử dụng để tìm và trả về thông tin về một sản phẩm dựa trên ID của nó.
Mở trang câu hỏi này →
Đề bài
for this action? [HttpPut("{id}")] public IActionResult UpdateProduct(int id, [FromBody] Product product) {
  // Logic to update the product return NoContent();
}
AGET
BPOST
CPUT
DDELETE
Lời giải
Để xác định HTTP verb phù hợp cho hành động cập nhật sản phẩm, chúng ta cần xem xét mục đích của hành động này. Hành động cập nhật sản phẩm là một hành động thay đổi trạng thái của sản phẩm hiện có. Trong HTTP, có bốn phương thức chính: GET, POST, PUT và DELETE. Mỗi phương thức có một mục đích riêng biệt. GET dùng để đọc dữ liệu, POST dùng để tạo mới dữ liệu, PUT dùng để cập nhật dữ liệu và DELETE dùng để xóa dữ liệu. Vì hành động cập nhật sản phẩm là thay đổi trạng thái của sản phẩm hiện có, nên phương thức phù hợp nhất cho hành động này là PUT. Phương thức PUT cho phép gửi một bản sao của tài nguyên đã tồn tại đến máy chủ, và máy chủ sẽ cập nhật tài nguyên đó. Trong trường hợp này, hành động cập nhật sản phẩm được định nghĩa bằng phương thức PUT, và nó nhận một id sản phẩm và một bản sao của sản phẩm từ cơ thể yêu cầu. Sau khi cập nhật sản phẩm, hành động này trả về trạng thái 204 No Content, cho biết sản phẩm đã được cập nhật thành công.
Mở trang câu hỏi này →
40To bind a parameter to a request header, which attribute is used?4 lựa chọnTrung bình50% trả lời đúng
A[FromHeader]
B[FromHead]
C[BindHeader]
D[InHeader]
Lời giải
Để gắn một tham số vào một yêu cầu tiêu đề, bạn cần sử dụng thuộc tính nào?
Mở trang câu hỏi này →
A[Format]
B[Pattern]
C[StringLength]
D[RegularExpression]
Lời giải
Để xác minh một thuộc tính theo một mẫu tùy chỉnh, chẳng hạn như một định dạng cụ thể cho mã sản phẩm (ví dụ: "PROD-1234"), thì thuộc tính nào phù hợp nhất?
Mở trang câu hỏi này →
AThe process of guessing the data types of action parameters.
BA feature where ASP.NET Core automatically applies binding source attributes ([FromRoute], [FromBody], etc.) based on conventions, reducing boilerplate code.
CThe ability to infer validation rules from property names.
DA mechanism for the client to tell the server where to find data.
Lời giải
Binding source parameter inference là một tính năng trong ASP.NET Core, được sử dụng trong các controller được đánh dấu bằng [ApiController]. Tính năng này cho phép ASP.NET Core tự động áp dụng các thuộc tính nguồn dữ liệu ([FromRoute], [FromBody], v.v.) dựa trên các quy ước, giảm thiểu mã nguồn lặp. Điều này giúp các nhà phát triển có thể tập trung vào việc xây dựng logic nghiệp vụ mà không cần phải viết mã nguồn để áp dụng các thuộc tính nguồn dữ liệu. Ví dụ, khi bạn tạo một controller với một phương thức hành động có tham số, ASP.NET Core sẽ tự động áp dụng thuộc tính nguồn dữ liệu phù hợp dựa trên quy ước. Điều này giúp giảm thiểu mã nguồn và tăng cường hiệu suất phát triển.
Mở trang câu hỏi này →
43What is the fundamental role of a Model Binder in ASP.NET Core?4 lựa chọnDễ100% trả lời đúng
ATo convert C# model objects into JSON or XML for the response.
BTo create instances of C# objects by extracting data from an incoming HTTP request (e.g., from the route, query string, or body).
CTo bind a database model to a DbContext.
DTo validate the properties of a model.
Lời giải
Trong ASP.NET Core, Model Binder đóng vai trò quan trọng trong việc tạo ra các đối tượng C# từ dữ liệu được gửi qua HTTP request. Nó có thể lấy dữ liệu từ các nguồn khác nhau như đường dẫn, chuỗi truy vấn hoặc cơ thể yêu cầu. Model Binder sẽ tạo ra các đối tượng C# dựa trên dữ liệu được gửi và giúp chúng ta dễ dàng truy cập và sử dụng dữ liệu đó trong ứng dụng. Ví dụ, khi gửi một form qua HTTP POST, Model Binder sẽ tạo ra một đối tượng C# dựa trên dữ liệu được gửi và giúp chúng ta dễ dàng truy cập các thuộc tính của đối tượng đó. Điều này giúp giảm thiểu mã code và tăng hiệu suất của ứng dụng.
Mở trang câu hỏi này →
AIt is the only way to define routes in minimal APIs.
BIt keeps the route definition next to the action method that it maps to, improving locality and discoverability.
CIt offers significantly better performance than conventional routing.
DIt is required for enabling Swagger/OpenAPI documentation.
Lời giải
Attribute routing là một phương pháp định tuyến trong ASP.NET Core, giúp người lập trình viên định nghĩa các tuyến đường (route) dựa trên các thuộc tính (attribute) của phương thức hành động (action method). Điều này giúp cải thiện tính cục bộ (locality) và tính dễ khám phá (discoverability) của mã nguồn. Khi sử dụng attribute routing, người lập trình viên có thể định nghĩa các tuyến đường ngay trong phương thức hành động mà nó tương ứng, thay vì phải định nghĩa chúng trong một file riêng biệt. Điều này giúp giảm thiểu sự phức tạp và tăng cường tính dễ hiểu của mã nguồn.
Mở trang câu hỏi này →