chúng tôi gặp sự cố với một trang web ASP.NET nơi các phiên của người dùng đang hoạt động kỳ quặc - dữ liệu phiên xuất hiện, biến mất và xuất hiện lại.
Tôi nghĩ tôi biết vấn đề là gì:
- Thiết lập của chúng tôi là 2 x Tải WebServers cân bằng + cơ sở dữ liệu trạng thái phiên đơn.
- Bộ lưu trữ trạng thái phiên ASP.NET SQL dường như phụ thuộc vào ID Instance của Trang web IIS (ID Metabase) để xác định duy nhất ID cookie phiên đến và truy xuất / lưu trữ giá trị.
- ID trường hợp trang web IIS của trang web khác nhau trên mỗi máy chủ trực tiếp (ID / W3SVC / 1 / Root trên máy chủ web A, ID / W3SVC / 2 / Root trên máy chủ web B).
- Cân bằng tải không sử dụng mối quan hệ khách hàng để mỗi yêu cầu HTTP của người dùng có thể đi đến một trong hai máy chủ.
Do đó, khi người dùng đăng nhập vào trang web và di chuyển xung quanh, mỗi cuộc gọi HTTP có thể đi đến một trong hai máy chủ web và do đó sử dụng bản ghi Trạng thái Phiên với các ID khác nhau tùy thuộc vào máy chủ. Trong thực tế, người dùng sẽ đồng thời có 2 phiên phiên riêng biệt. Tôi tin rằng tôi đã xác minh điều này như trong cơ sở dữ liệu bảng ASPStateTempSments của , mỗi ID cookie phiên dường như tương ứng với 2 bản ghi có tên gần như giống hệt nhau (ID của chúng chỉ khác nhau bởi một vài ký tự cuối cùng, mà tôi tin là một công cụ sửa đổi dựa trên AppID từ Bảng AspStateTempAppluggest ) được tạo trong vòng vài giây với nhau.
Do đó, Trạng thái Phiên sẽ xuất hiện sai khi các thay đổi được thực hiện cho một bản ghi phiên sẽ chỉ tồn tại đối với máy chủ web đó. Nếu Người dùng di chuyển đến máy chủ cân bằng tải khác, các giá trị phiên sẽ dường như biến mất hoặc hoàn nguyên.
Tôi tin rằng giải pháp là đồng bộ hóa ID Instance IIS của các trang web (ví dụ: tạo cả hai / W3SVC / 1 / Root ), nhưng tôi đã cố gắng chỉnh sửa giá trị đó trong IIS trong Cài đặt nâng cao và mặc dù nó đã được lưu trang web trả về 404 trên máy chủ đó cho đến khi tôi thay đổi lại.
Tôi tìm thấy tập lệnh VBS cho vấn đề này nhưng dường như chỉ dành cho IIS 6 nên tôi lo lắng về việc thử nó. Có ai khác gặp phải tình huống này trên IIS 7.5 không, và bạn đã khắc phục nó như thế nào?
EDIT / GIẢI PHÁP
Lỗi của tôi là tôi đã quên khởi động lại IIS sau khi tôi thay đổi ID trường hợp trang web trong IIS. Sau này, ID đã được cập nhật và các phiên ASP.NET được đồng bộ hóa trên hai máy chủ web.
Hướng dẫn đầy đủ:
- Remote Desktop lên máy chủ LIVE1, mở IIS Mgr, nhấp vào trang web có vấn đề và chọn Cài đặt nâng cao trong thanh bên.
- Thay đổi ID thành một cái gì đó duy nhất, ví dụ 10. Nhấp vào OK.
- Khởi động lại dịch vụ web (
c:\windows\system32\iisreset /restart
)
Thực hiện tương tự cho LIVE2 (đảm bảo ID trang web giống như trên LIVE1)
Lưu ý rằng ID trang web sẽ ảnh hưởng đến vị trí của tệp trang web, ví dụ: thư mục tệp nhật ký sẽ trở thành C:\inetpub\logs\LogFiles\W3SVC10
ví dụ.
Cũng lưu ý rằng bạn có thể thực hiện các thay đổi này theo cách thủ công bằng cách chỉnh sửa thuộc tính id trang web trong tệp cấu hình IIS trên mỗi máy chủ : C:\Windows\System32\inetsrv\config\applicationHost.config
. Yêu cầu quản trị viên tư nhân và vẫn cần thiết lập lại sau đó.