OData .NET (ODL) 9 Bản Preview – Những Thay Đổi Quan Trọng

Ngày 22 tháng 8 năm 2025 – John Gathogo, Senior Software Engineer

Chúng tôi rất vui mừng thông báo rằng OData .NET (ODL) 9 Preview 2 đã chính thức được phát hành và có sẵn trên NuGet:

Có Gì Mới Trong OData .NET (ODL) 9 Preview 1 & 2

Phiên bản OData .NET (ODL) 9.0 preview giới thiệu một loạt các thay đổi quan trọng và nỗ lực dọn dẹp để hiện đại hóa thư viện, phù hợp với runtime .NET đang phát triển và đơn giản hóa trải nghiệm phát triển OData.

Hỗ Trợ .NET 10 Preview

ODL hiện được xây dựng dựa trên .NET 10 preview, đảm bảo khả năng tương thích với runtime sắp tới. Điều này giúp những người dùng sớm xác thực khối lượng công việc OData trên nền tảng mới nhất.

Loại Bỏ Hỗ Trợ JSONP

JSONP (JSON với Padding) là một giải pháp tạm thời sớm cho chính sách same-origin của trình duyệt trước khi CORS được áp dụng rộng rãi. Nó cho phép client yêu cầu dữ liệu JSON từ một tên miền khác bằng cách bao bọc payload bên trong một lệnh gọi hàm JavaScript.

Tại sao Nó Bị Loại Bỏ:

  • Lo ngại bảo mật: JSONP cho phép thực thi JavaScript tùy ý, có thể bị khai thác trong các cuộc tấn công kiểu XSS.
  • Thay thế bởi CORS: Các trình duyệt và framework hiện đại hỗ trợ gốc Cross-Origin Resource Sharing (CORS), cung cấp cách an toàn và dựa trên tiêu chuẩn để cho phép yêu cầu chéo miền.
  • Mức độ sử dụng thấp: Rất ít người dùng ODL dựa vào JSONP trong những năm gần đây.

Bằng cách loại bỏ hỗ trợ JSONP, ODL 9 giảm bề mặt tấn công và đơn giản hóa codebase, mà không ảnh hưởng đến phần lớn client OData hiện đại.

Bộ Giải URI Không Phân Biệt Chữ Hoa Theo Mặc Định

Trước đây, người dùng phải bật rõ ràng xử lý không phân biệt chữ hoa/thường cho các tùy chọn truy vấn như $filter, $select, v.v.

Theo đặc tả OData V4.01, các dịch vụ PHẢI hỗ trợ tên tùy chọn truy vấn hệ thống không phân biệt chữ hoa/thường, cho dù chúng có được bắt đầu bằng $ hay không.

Ví Dụ:

Với thay đổi này, tên tùy chọn truy vấn được phân tích tương đương bất kể chữ hoa/chữ thường:

GET https://localhost:54001/odata/Books?$expand=Authors
GET https://localhost:54001/odata/Books?$expand=authors

Cải Thiện Xác Thực Tên Kiểu CSDL

ODL hiện thực hiện xác thực nghiêm ngặt hơn đối với tên kiểu khi phân tích tài liệu CSDL. Điều này đảm bảo rằng chỉ các tên kiểu hợp lệ được chấp nhận và các thông báo lỗi rõ ràng, nhất quán được tạo ra khi gặp các trường hợp không hợp lệ.

Những gì đã thay đổi:

Các kiểm tra xác thực đã được cải thiện để phát hiện các vấn đề như:

  • Dấu ngoặc không khớp hoặc đặt sai vị trí
  • Tiền tố kiểu không được hỗ trợ
  • Hậu tố không hợp lệ hoặc ký tự thừa
  • Tên kiểu trống hoặc chỉ chứa khoảng trắng
  • Sử dụng không hợp lệ Collection hoặc Ref

Loại Bỏ Các Cờ và Thuộc Tính Đã Lỗi Thời

KeyComparisonGeneratesFilterQuery

Trong ODL 9, chúng tôi đã loại bỏ hoàn toàn cờ DataServiceContext.KeyComparisonGeneratesFilterQuery. OData .NET Client hiện luôn dịch LINQ Where so sánh các thuộc tính khóa thành truy vấn $filter và nó dành dạng phân đoạn khóa cho các lệnh gọi ByKey(...) rõ ràng.

Thuộc Tính Timeout

Thuộc tính DataServiceContext.Timeout đã lỗi thời đã được loại bỏ hoàn toàn. Như đã đề xuất từ phiên bản 8.x, hãy cấu hình timeout trên HttpClient của bạn thông qua IHttpClientFactory và các trình xử lý liên quan, thay vì trên bề mặt client OData.

Giảm Chú Thích Payload Dư Thừa

Khi tạo payload, OData client sẽ tuần tự hóa chú thích @odata.type ngay cả cho các thuộc tính đã khai báo và các instance không được kế thừa. Mặc dù về mặt kỹ thuật là hợp lệ, nhưng các chú thích này làm tăng kích thước payload và thêm nhiễu mà không cung cấp giá trị bổ sung.

Ví Dụ Trước Đây:

{
"@odata.type": "#Ns.Models.Order",
"Id": 1,
"Status@odata.type": "#Ns.Models.OrderStatus",
"Status": "Pending",
"Tags@odata.type": "#Collection(String)",
"Tags": ["Urgent"],
"ShippingAddress": {
"@odata.type": "#Ex340.Models.Address",
"Street": "123 Main St"
}
}

Với ODL 9:

{
"Id": 1,
"Status": "Pending",
"Tags": ["Urgent"],
"ShippingAddress": {
"Street": "123 Main St"
}
}

Loại Bỏ Hỗ Trợ Cho Các Kiểu Khóa Generic Nullable

Trong các phiên bản trước của OData client, có một lỗi cho phép các thuộc tính nullable được chỉ định làm thuộc tính khóa trong định nghĩa kiểu thực thể.

Tại sao Đây Là Vấn Đề:

  • Vi phạm đặc tả OData: Các khóa thực thể phải luôn là non-nullable. Một khóa null sẽ làm cho định danh của thực thể không xác định.
  • Lỗi runtime tiềm ẩn: Các khóa nullable có thể dẫn đến URI không hợp lệ hoặc hành vi máy chủ không thể đoán trước.

Tiện Ích URI Tùy Chỉnh Được Đăng Ký Theo Mô Hình EDM

Một thay đổi quan trọng khác trong ODL 9 là cách các hàm URI tùy chỉnh, tiền tố literal và trình phân tích literal được đăng ký. Trước đây, chúng được đăng ký toàn cục bằng cách sử dụng các helper tĩnh.

Những Gì Đã Thay Đổi:

Trong ODL 9, chúng hiện được đăng ký theo từng mô hình EDM thay vì toàn cục. Điều này cải thiện sự cô lập, tránh xung đột ngoài ý muốn và cho phép kiểm soát chi tiết.

Ví Dụ Sử Dụng:

GET http://localhost/WeatherForecast?$filter=tofahrenheit(Temperature) gt 70
GET http://localhost/WeatherForecast?$filter=Temperature eq temp'79.7:Fahrenheit'

Tóm Tắt

Các bản preview ODL 9 mang đến những cập nhật ý nghĩa:

  • Hỗ trợ runtime hiện đại (nhắm mục tiêu .NET 10)
  • Loại bỏ các tính năng lỗi thời (JSONP, các thuộc tính/cờ đã lỗi thời)
  • Cải thiện khả năng sử dụng (bộ giải URI không phân biệt chữ hoa theo mặc định, giảm nhiễu payload)
  • Tiếp cận mô hình cụ thể mạnh mẽ hơn đối với các hàm, tiền tố và trình phân tích URI tùy chỉnh

Những thay đổi này mở đường cho trải nghiệm OData sạch hơn, dễ đoán hơn trong tương lai. Trong các bản cập nhật tiếp theo, chúng tôi sẽ cung cấp các ví dụ sâu hơn và hướng dẫn di chuyển cho các nhà phát triển nâng cấp lên ODL 9.

Hãy thử các gói ODL 9 preview trên NuGet và chia sẻ phản hồi trên GitHub repo.