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

POS LS Central báo "Index out of bounds" sau khi copy database

POS LS Central copy từ máy khác báo Index out of bounds ở CreateWebRequest: bảng Web Request xml (99009643) bị trống. Cách tìm và cách chép bảng sang.

Lỗi nằm ở bảng Web Request xml (99009643) bị trống trên database POS. LS Central dựng web request bằng cách duyệt các node XML của từng request trong bảng này. Bảng rỗng thì nó lấy phần tử theo vị trí, không có phần tử nào nên báo "Index out of bounds" ở "LSC Web Request Handler".CreateWebRequest dòng 54. Cách sửa là chép bảng đó từ một POS đang chạy tốt sang bằng Configuration Package.

Bài này ghi lại một buổi dò lỗi ngày 09/10/2026 trên LS Central 26.1.6, mất gần hai tiếng, trong đó phần lớn thời gian đi sai hướng. Phần đi sai mới là phần đáng đọc.

Bối cảnh#

  • LS Central 26.1.6, POS chạy on-prem, Head Office trên Business Central SaaS.
  • Database POS mới được copy từ một POS khác đang chạy tốt, sau đó sửa lại Web Service Setup và Web Requests 2.0 cho đúng máy mới.
  • Mở POS, bấm Test Web Connection (old) trên Distribution Location: đều báo "Index out of bounds". Test Web Connection (new) thì qua.

Call stack của cả hai lỗi, lúc mở POS (luồng lấy Retail Message) và lúc bấm Test (old) (luồng TestConnection), đều dừng ở cùng một chỗ: CreateWebRequest dòng 54.

Các hướng đã đi sai#

LượtĐoánVì sao sai
1URL web service lặp hai chữ WS liền nhau nên LS tách chuỗi sai. Sửa Service Name thành tên instance chínhServer có hẳn một instance tên WS chạy NavUserPassword, dành riêng cho web service. Chữ WS đầu là tên instance, chữ sau là đường dẫn SOAP. URL gốc đúng. Sửa xong thì Publisher bị 401
2401 do gọi bằng tên máy, đổi Server Computer Name sang IPCó một phần đúng (gọi bằng tên máy trên chính server bị lỗi), nhưng không liên quan tới Index out of bounds. Lại phải trả cấu hình về gốc
3Test (old) chỉ dành cho LSC 24.3 trở xuống, bỏ qua đượcPOS gốc bấm Test (old) vẫn qua trên cùng bản LSC 26
4Retail Setup: HO Distribution Location trỏ vào location HO thiếu cấu hìnhĐổi sang location khác thì POS mở được, nhưng chỉ là tránh đi request lỗi chứ không sửa nó
5Location HO thiếu Web Service Client Secret (trường mã hoá, copy database không mang theo)Đúng là thiếu, điền vào vẫn lỗi
6So bốn bảng Retail Setup, Distribution Location, Web Service Setup, Web Request 2.0 giữa hai POS. Thấy khác Only Local RequestBật lên vẫn lỗi
7Web Requests 1.0 thiếu dòng TestConnectionHai bên cùng 33 dòng, khớp hết

Lượt 8 mới trúng: mở Web Requests 2.0, chọn dòng TestConnection, bấm Request xml. POS mới trống trơn, POS gốc có 14 dòng.

Vì sao bảng này trống#

Bảng Web Requests 2.0 export ra Excel chỉ có bảy cột chính: Request ID, Definition Url, Operation... Hai bên khớp đủ 179 dòng nên rất dễ tin là cấu hình đã giống nhau. Định nghĩa XML request/response của từng dòng lại nằm ở bảng con Web Request xml (99009643), không hiện trên danh sách và không đi theo file export.

Bảng con này do nút Subscriber trên trang Web Requests 2.0 sinh ra. Subscriber đọc WSDL của từng service đã publish rồi ghi các node vào bảng. Database POS mới không có dữ liệu bảng này, và khi bấm Subscriber thì nó dừng giữa chừng ở RetailMessageGetActiveList với lỗi 500 (server gọi chính nó bằng tên máy không được, gọi bằng IP thì được).

Sửa#

  1. Trên POS đang chạy tốt, tạo Configuration Package, thêm bảng 99009643, export ra Excel. Bản export lần này có 19.422 dòng cho 167 request.
  2. Kiểm file không dính tên company hay tên server của POS gốc. Lần này không có, nên dùng nguyên được.
  3. Trên POS mới, tạo package cùng mã, thêm bảng 99009643, Import from Excel, kiểm số record và cột Errors bằng 0, rồi Apply Package.
  4. Mở Web Requests 2.0, chọn TestConnection, bấm Request xml: đã có dữ liệu. Test (old) qua, POS mở được.

Cách thứ hai là sửa lỗi gọi bằng tên máy (đổi Server Computer Name sang IP, hoặc thêm BackConnectionHostNames) rồi chạy lại Publisher và Subscriber. Cách này đúng hơn về lâu dài, nhưng chép bảng thì nhanh hơn khi hai POS cùng bản LS.

Rút ra#

Lỗi ở CreateWebRequest dòng 54 thì mở Request xml của request đang lỗi trước tiên. Đây là tầng chung mà mọi web request 2.0 đi qua. Lỗi ở đây với nhiều request, nhiều location khác nhau thì nguyên nhân không nằm ở location đích hay URL, mà ở dữ liệu LS đọc trước khi gửi.

POS copy từ máy khác thì kiểm các bảng con, không chỉ bảng chính. Danh sách Web Requests 2.0 khớp từng dòng vẫn có thể thiếu hết định nghĩa XML bên dưới. Cùng loại với Client Secret: trường mã hoá không đi theo khi copy database, nên location trông đủ ô nhưng ô secret trống.

Đọc call stack rồi mới sửa setup. Hai call stack đã chỉ ra từ đầu rằng hai luồng khác nhau cùng vỡ một chỗ. Sáu lượt đầu đều sửa setup theo kinh nghiệm chung (URL, xác thực, location), mỗi lượt sửa một chỗ trông có vẻ sai, và vài lượt làm hỏng thêm cấu hình vốn đúng. Muốn đoán về cấu trúc server thì xin file config trước: chỉ cần thấy server có instance tên WS là đã không sửa URL.

So sánh với máy đang chạy tốt là cách nhanh nhất, nhưng phải so đủ tầng. So bốn bảng setup không ra, vì thứ khác nhau nằm ở bảng con mà file export không có. Khi so, liệt kê luôn những bảng chưa so được.

Ghi lại những gì đã đổi trong lúc dò. Sau buổi này POS mới đã bị đổi Client Secret, HO Distribution Location, Only Local Request, Debug Mode và Server Log Level. Chỉ Client Secret là phải giữ. Các chỗ còn lại phải xem lại từng cái, và Debug Mode phải tắt, không thì log ghi liên tục.

Đọc tiếp