Đến nội dung chính
ERP Thực Chiến
Thư viện
Menu

HttpClient.Timeout of 120 seconds làm POS LS Central đứng 2 phút

HttpClient.Timeout of 120 seconds trong Event Viewer làm POS LS Central đứng 2 phút. Bốn bước tìm lời gọi gây treo: call stack, POS Debug Log, log HĐĐT.

Câu The request was canceled due to the configured HttpClient.Timeout of 120 seconds elapsing trong Event Viewer nghĩa là một đoạn code AL gọi ra dịch vụ bên ngoài, chờ đủ 120 giây không có trả lời thì bị hủy. Suốt 120 giây đó phiên POS LS Central bị treo. Muốn biết lời gọi nào gây treo, đọc AL call stack của event rồi bật POS Debug Log.

Tôi gặp lỗi này ngày 24/09/2026 ở một chuỗi F&B chạy LS Central trên server riêng, khi khách báo máy POS đứng từng lúc. Bốn bước dưới đây chạy trên log thật của hôm đó.

The request was canceled due to the configured HttpClient.Timeout of 120 seconds elapsing là gì#

Event Viewer trên server BC có event 218 lặp 7 lần trong 25 phút, session type WebClient, tức phiên POS chạy trên web client:

text
NavNCLOperationCanceledException
The request was canceled due to the configured HttpClient.Timeout of 120 seconds elapsing.

Cùng khoảng giờ, instance web service báo event 701 và 705, instance chính có thêm một loạt event 216.

Theo trang HttpClient.Timeout trên Microsoft Learn, HttpClient trong AL mặc định chờ 100 giây. Log ghi 120 nên nhiều khả năng chỗ gọi đã tự đặt thời gian chờ, mà đã đặt được thì hạ xuống được.

Ở POS, lời gọi HTTP thường là hóa đơn điện tử, thanh toán QR hoặc ví điện tử, web service từ store về HO của LS Central, hoặc extension tự viết.

Bước 1: đọc AL call stack ngay trong event#

Event 218 có dòng ShouldCalculateALCallStack: True. Cuộn xuống cuối tab General hoặc mở tab Details là thấy AL call stack, cho biết codeunit nào của extension nào đang gọi HTTP. Mở thêm vài event 216 và 701 xem có nhắc cùng endpoint không.

Biết endpoint rồi thì kiểm kết nối từ chính server BC:

powershell
Test-NetConnection <host> -Port 443

TcpTestSucceeded ra False thì xem DNS, proxy, firewall. Ra True mà vẫn timeout thì xem chứng chỉ SSL và hỏi bên cung cấp giờ đó có sự cố không.

Bước 2: bật POS Debug Log, chọn Log Level nào#

Call stack không cho biết thu ngân đang bấm gì lúc máy đứng, việc đó cần POS Debug Log. Mở trang POS Debug Log Setup (hướng dẫn của LS Retail) và đặt như sau:

FieldĐặtLý do
Debug Log EnabledBậtĐang tắt thì chỉnh các dòng bên dưới cũng không ghi gì
Log LevelDebugError chỉ ghi lỗi. Trace ghi quá nhiều, POS đang chậm còn chậm thêm
Log PerformanceOnGhi thời gian từng thao tác. All Data ghi rất nhiều
Log Dual DisplayBỏ tickBớt nhiễu, trừ khi nghi màn hình phụ
Start Time, End TimeKhoảng giờ đang testKhông ghi cả ngày
Log TypeDatabaseChọn File thì phải khai đường dẫn trên server
Áp cho Store hay TerminalStoreChỉ một máy chậm thì chọn Terminal

Bấm thử vài giao dịch rồi mở trang POS Debug Log. Chưa có dòng nào thì cho POS đăng xuất, đăng nhập lại, vì POS có thể chỉ đọc cấu hình lúc mở phiên. Xong việc thì trả Log Level về Error và tắt Debug Log Enabled.

Mỗi thao tác ra một dòng kèm số mili giây (tên panel thanh toán đã thay):

text
04:55:11.577 PM | [#NUMPAD] BUTTONPRESS,OK: 4586 ms, 78 SqlRows, 120 SqlStmt
04:55:42.653 PM | [<panel QR>] IDLETIMERTICK,: 21129 ms, 63 SqlRows, 56 SqlStmt

Bước 3: đối chiếu log hóa đơn điện tử và log thanh toán theo giờ, không theo bill#

Lúc đầu tôi đọc log của bill khách chỉ ra, lúc 15:34: tạo QR khoảng 3,1 giây, hỏi trạng thái thanh toán ba lần ra PROCESSING rồi tới SUCCESS, gọi hóa đơn điện tử khoảng 3,8 giây. Không lời gọi nào gần 120 giây, vì các event 218 rơi vào 15:44 tới 16:09, sau bill đó mười phút trở đi.

Ba chỗ dễ đọc sai trong trang log của extension hóa đơn điện tử:

  • Cột Duration In Milliseconds ghi 0 cho lệnh tạo hóa đơn, trong khi thời gian thật khoảng 3,8 giây. Lấy giờ kết thúc trừ giờ bắt đầu.
  • Lệnh tra hóa đơn chạy khi lệnh tạo chưa xong, nên nhà cung cấp trả HTTP 400 NOT_FOUND_DATA. Hóa đơn vẫn tạo thành công, dòng lỗi này không làm chậm.
  • Khi HttpClient timeout, AL báo lỗi và rollback, dòng log có thể mất theo. Bill POS nào trong khoảng giờ có event mà không có dòng log hóa đơn điện tử thì gần như chắc là bill bị treo.

Log tích hợp thanh toán có hai điểm tôi gửi dev hỏi. Bước mã hóa mất 0,55 tới 1,2 giây mỗi lần, quá lâu cho mã hóa tại chỗ, nên nhiều khả năng cũng là một lời gọi HTTP. Và từ lúc thanh toán xong tới lúc gọi hóa đơn điện tử có 16,5 giây trống.

Bước 4: đặt mọi mốc giờ lên một dòng thời gian#

Debug Log trên máy chậm, từ 16:54 tới 17:05, chỉ ra chỗ treo ở panel thanh toán QR:

GiờDòng trong Debug LogThời gian
16:55:42[<panel QR>] IDLETIMERTICK21,1 giây
17:00:00[#NUMPAD] BUTTONPRESS,OK, trong đó in bill 6 giây9,6 giây
17:04:47[<panel QR>] IDLETIMERTICK17,0 giây
Các lần khác[#NUMPAD] BUTTONPRESS,OK4,1 tới 4,6 giây
Mỗi lần mở QRPRINT,RAWPRINT qua hardware stationKhoảng 1,9 giây

Lần 16:55 diễn ra như sau:

GiờViệc xảy ra
16:55:11.5Thu ngân bấm OK, POS mở panel QR
16:55:21.5 tới 16:55:42.6Timer chạy IDLETIMERTICK, gửi một request lên server. Log không có dòng nào, POS đứng hẳn
16:55:44.2Thu ngân bấm CANCEL, nhiều khả năng đã bấm từ lúc máy còn đứng

Vì sao IDLETIMERTICK làm POS đứng: suy luận, chưa được dev xác nhận#

Log thanh toán của bill 15:34 cho thấy cứ khoảng 5 giây có một lượt hỏi trạng thái, lặp 4 lần, cộng lại khoảng 20 giây, khớp hai lần treo 17 và 21 giây. Tôi suy ra code xử lý IDLETIMERTICK của panel QR hỏi trạng thái nhiều lần, có Sleep giữa các lần, trong cùng một lần gọi server. POS bị khóa suốt vòng hỏi đó. Một lời gọi tới ngân hàng, bước mã hóa hay nhà cung cấp hóa đơn điện tử không trả lời thì HttpClient chờ đủ 120 giây, đúng event 218.

Tôi chưa mở code của panel thanh toán, và tới lúc viết bài dev chưa xác nhận. Cách chốt: xuất log thanh toán của hai bill lúc 16:55 và 17:04, các dòng hỏi trạng thái nằm gọn trong 16:55:21 tới 16:55:42 và 17:04:30 tới 17:04:44 thì kết luận được.

Đề xuất tôi gửi dev:

  • Mỗi IDLETIMERTICK chỉ hỏi trạng thái một lần rồi trả quyền về POS, không Sleep trong AL. Muốn hỏi dày hơn thì giảm chu kỳ timer, log hiện ghi IntData1: 15.
  • Đặt HttpClient.Timeout 5 tới 10 giây cho cổng QR của ngân hàng, bước mã hóa và hóa đơn điện tử. Hết giờ thì báo chưa có kết quả, lần tick sau hỏi lại.
  • Tạo hóa đơn điện tử sau khi đóng panel thanh toán hoặc đưa vào hàng đợi, để 4 giây gọi hóa đơn không cộng vào lúc thu ngân chờ.
  • Kiểm máy in và driver, vì lần in bill 6 giây và mỗi lần RAWPRINT gần 2 giây đều qua hardware station.

Đọc tiếp