Tôi gặp sự cố khi nhận 2 ứng dụng ASP.NET MVC giống hệt nhau để chia sẻ cùng một Phiên sử dụng Session StateServer. Lý do tôi đang cố gắng làm điều này là cuối cùng chúng tôi sẽ triển khai ứng dụng này trên 3 máy chủ web cần chia sẻ cùng một trạng thái. Chúng ta cần sử dụng StateServer vì chúng ta đang cố gắng giảm thiểu việc sử dụng db để lưu trữ không liên quan đến dữ liệu.Tại sao tôi không thể chia sẻ trạng thái Phiên giữa 2 ứng dụng web với StateServer? Tôi đang thiếu gì?
Setup:
tôi đã triển khai các cơ sở mã cùng http://localhost/App1 và http://localhost/App2
cả hai đều có file Web.Config giống hệt với những điều sau:
<system.web>
<sessionState mode="StateServer"
cookieless="false"
timeout="20"
stateConnectionString="tcpip=127.0.0.1:42424" />
//stateConnectionString="tcpip=192.168.1.52:42424" /> // also doesn't work
<machineKey
validationKey="8B9F68D0CC730F6F046D0173021C34B1A0D9A01C21D8E4D4A7A1DFF38332DEE8CBBAFEA503C18776614EE9D4F7EEA7E5D2D5571630547D822485A27B1EF53AC1"
decryptionKey="60009563EFCFC594FD1BC46684943AA398EE70412A624B2EB488BBB071F15ECF"
validation="SHA1" decryption="AES" />
Tôi đã sử dụng this tool to generate these machine keys
Các thử nghiệm:
tôi đặt sau đây vào một trong những điều khiển của tôi để kiểm tra xem nó đã làm việc:
ViewData["mode"] = requestContext.HttpContext.Session.Mode.ToString();
string timestamp = DateTime.Now.ToString();
if (requestContext.HttpContext.Session["timestamp"] == null)
{
requestContext.HttpContext.Session["timestamp"] = timestamp;
}
ViewData["timestamp"] = requestContext.HttpContext.Session["timestamp"].ToString();
ViewData["realtime"] = timestamp;
với điều này trong giao diện:
<p>
Mode: <%= ViewData["mode"].ToString() %>
</p>
<p>
Time: <%= ViewData["timestamp"].ToString() %>
</p>
<p>
real time: <%= ViewData["realtime"].ToString() %>
</p>
Kết quả:
Đối với cả hai triển khai, khi trang đầu tiên tải, tôi có thể thấy rằng chế độ là StateServer và dấu thời gian được đặt cùng lúc với giá trị thời gian thực .. Tuy nhiên, nếu điều này đang hoạt động, chỉ trang đầu tiên phải có cùng một thời gian làm giá trị thời gian thực. Tải trang thứ hai nên đọc từ máy chủ StateServer vì giá trị dấu thời gian đó không còn null và hiển thị giá trị thời gian đó. Nhưng thay vào đó, nó hiển thị giá trị thời gian thực một lần nữa.
Khi tôi làm mới trang, tôi dấu thời gian vẫn giữ nguyên và giá trị thời gian thực luôn cập nhật. Điều này cho biết dấu thời gian đang được lưu vào Phiên, nhưng giá trị dấu thời gian luôn khác nhau cho cả hai lần triển khai khi nó giống nhau, vì vậy điều này cho biết Phiên không được chia sẻ.
Ai đó có thể chỉ ra nếu tôi đang làm điều gì đó sai hoặc nếu có điều gì khác tôi cần phải làm để có được điều này để làm việc? Cảm ơn
bạn đã có thể hoàn thành này? –
@DaveDev tôi biết tôi đến trễ bữa tiệc: P, nhưng điều này có thể giúp người khác. nếu bạn có thể tìm cách chia sẻ cùng một miền cho cookie phiên (xem https://msdn.microsoft.com/en-IN/library/ms228262(v=vs.85).aspx) và lưu trữ phiên làm việc tại dịch vụ phổ biến (DB/Redis) sau đó bạn hoàn toàn có thể chia sẻ phiên giữa nhiều máy chủ –