ปัญหาสถานะของเซสชัน ASP.NET ASP.NET เว็บโหลดดุล IIS


14

เรามีปัญหากับเว็บไซต์ ASP.NET ที่เซสชันของผู้ใช้ทำงานผิดปกติ - ข้อมูลเซสชันปรากฏขึ้นหายไปและปรากฏขึ้นอีกครั้ง

ฉันคิดว่าฉันรู้ว่าปัญหาคืออะไร:

  1. การตั้งค่าของเราคือ 2 x โหลดบาลานซ์ WebServers + ฐานข้อมูลสถานะเซสชันเดียว
  2. ที่เก็บข้อมูลสถานะเซสชัน ASP.NET ASP.NET SQL ปรากฏขึ้นอยู่กับรหัสอินสแตนซ์ของเว็บไซต์ IIS (รหัส Metabase) เพื่อระบุรหัสคุกกี้เซสชันที่เข้ามาโดยไม่ซ้ำกันและเรียกคืน / เก็บค่า
  3. ID อินสแตนซ์ของเว็บไซต์ IIS ของเว็บไซต์นั้นแตกต่างกันในแต่ละเซิร์ฟเวอร์ที่ใช้งานจริง (ID / W3SVC / 1 / รูทบนเว็บเซิร์ฟเวอร์ A, ID / W3SVC / 2 / รูทบนเว็บเซิร์ฟเวอร์ B)
  4. โหลดบาลานซ์ไม่ได้ใช้ความสัมพันธ์กับลูกค้าดังนั้นคำขอ HTTP ของผู้ใช้แต่ละคนสามารถไปที่เซิร์ฟเวอร์ใดเซิร์ฟเวอร์หนึ่ง

ดังนั้นในขณะที่ผู้ใช้ล็อกเข้าสู่เว็บไซต์และย้ายไปรอบ ๆ การโทร HTTP แต่ละครั้งสามารถไปที่เว็บเซิร์ฟเวอร์และใช้ระเบียนสถานะเซสชันที่มี ID แตกต่างกันขึ้นอยู่กับเซิร์ฟเวอร์ ผู้ใช้จะมีอินสแตนซ์ของเซสชันแยกกัน 2 รายการพร้อมกัน ฉันเชื่อว่าฉันได้รับการตรวจสอบนี้เป็นฐานข้อมูลASPStateTempSessionsตารางแต่ละ ID เซสชันคุกกี้ดูเหมือนว่าจะตรงตามลักษณะที่ 2 ชื่อเกือบเหมือนบันทึก (รหัสของพวกเขาเท่านั้นที่แตกต่างกันโดยตัวละครไม่กี่สุดท้ายซึ่งผมเชื่อว่าเป็นตัวปรับแต่งบนพื้นฐานของAppIDจากตารางAspStateTempApplications ) สร้างขึ้นภายในไม่กี่วินาทีซึ่งกันและกัน

ดังนั้นสถานะเซสชันจะทำงานผิดปกติเนื่องจากการเปลี่ยนแปลงที่ทำกับบันทึกหนึ่งเซสชันจะยังคงอยู่กับเว็บเซิร์ฟเวอร์นั้นเท่านั้น หากผู้ใช้ย้ายไปยังเซิร์ฟเวอร์อื่นที่สมดุลโหลดค่าเซสชั่นจะดูเหมือนจะหายไปหรือย้อนกลับ

ฉันเชื่อว่าทางออกคือการซิงโครไนซ์ ID อินสแตนซ์ IIS ของไซต์ (เช่นทำให้ทั้งคู่/ W3SVC / 1 / รูท ) แต่ฉันพยายามแก้ไขค่านั้นใน IIS ภายใต้การตั้งค่าขั้นสูงและแม้ว่ามันจะบันทึกตกลงก็ตาม ไซต์ส่งคืน 404s บนเซิร์ฟเวอร์นั้นจนกว่าฉันจะเปลี่ยนกลับ

ฉันพบสคริปต์ VBSสำหรับปัญหานี้ แต่ดูเหมือนว่าจะเป็น IIS 6 เท่านั้นดังนั้นฉันจึงกังวลเกี่ยวกับการลองใช้ มีคนอื่นพบสถานการณ์นี้ใน IIS 7.5 แล้วและคุณจะแก้ไขได้อย่างไร


แก้ไข / แก้ไข

ความผิดพลาดของฉันคือฉันลืมรีสตาร์ท IIS หลังจากเปลี่ยน Site Instance ID ใน IIS หลังจากนี้ ID ถูกอัพเดตและเซสชัน ASP.NET ถูกซิงค์บนเว็บเซิร์ฟเวอร์สองเครื่อง

คำแนะนำแบบเต็ม:

  1. เดสก์ท็อประยะไกลไปยังเซิร์ฟเวอร์ LIVE1 เปิด IIS Mgr คลิกที่ไซต์ที่มีปัญหาและเลือกการตั้งค่าขั้นสูงในแถบด้านข้าง
  2. เปลี่ยน ID เป็นสิ่งที่ไม่ซ้ำกันเช่น 10. คลิกตกลง
  3. รีสตาร์ทเว็บเซอร์วิส ( c:\windows\system32\iisreset /restart)

ทำเช่นเดียวกันสำหรับ LIVE2 (ตรวจสอบให้แน่ใจว่า ID ไซต์เหมือนกับใน LIVE1)

โปรดทราบว่า ID ไซต์จะมีผลกับตำแหน่งของไฟล์ไซต์เช่นโฟลเดอร์ไฟล์บันทึกC:\inetpub\logs\LogFiles\W3SVC10เป็นต้น

ยังทราบว่าคุณสามารถทำการเปลี่ยนแปลงเหล่านี้ด้วยตนเองโดยการแก้ไขเว็บไซต์IDแอตทริบิวต์ใน IIS ไฟล์ config C:\Windows\System32\inetsrv\config\applicationHost.configในแต่ละเซิร์ฟเวอร์: ต้องใช้ privs ของผู้ดูแลระบบและยังคงต้องการการรีเซ็ตในภายหลัง

คำตอบ:


11

เมื่อพิจารณาจากคำถามของคุณดูเหมือนว่าคุณมีเซิร์ฟเวอร์สถานะเซสชันกลาง (DB?) ที่ติดตามข้อมูลเซสชันหรือไม่

คุณต้องซิงโครไนซ์หมายเลขเครื่องที่ใช้สำหรับการเข้ารหัสสำหรับการตรวจสอบความถูกต้องของแบบฟอร์มและอื่น ๆ เพื่อให้ทำงานได้ นี่อาจส่งผลต่อการระบุเซสชันฉันไม่แน่ใจ

การกำหนดค่าเครื่องคีย์ใน IIS 7

นอกจากนี้คุณควรใช้การกำหนดค่าที่ใช้ร่วมกันระหว่างเครื่องมันอาจแก้ไขปัญหาด้วยปุ่มเครื่องที่แตกต่างกัน

การกำหนดค่า IIS ให้ตรงกันสำหรับเว็บเซิร์ฟเวอร์ฟาร์มหรือไม่

แก้ไข: เมื่อคุณเปลี่ยนรหัสไซต์คุณพยายามเริ่มต้นตัวจัดการ IIS เพื่อดูว่า webroot เปลี่ยนไปหรือไม่ บางทีการกำหนดค่าเชื่อมต่อกับ ID ซึ่งหมายความว่าการเปลี่ยนแปลงใน ID นั้นจะปรับเปลี่ยนสิ่งต่าง ๆ เช่นรูทเอกสารเป็นต้น


ขอบคุณสำหรับแนวคิดที่ Jishi แต่ฉันได้ซิงค์ machineKey ใน web.configs แล้ว ฉันเดาว่าฉันกำลังมองหาวิธีในการเปลี่ยน IIS Instance ID ของไซต์โดยไม่ต้องลบและกำหนดค่าไซต์บนเว็บเซิร์ฟเวอร์อีกครั้ง
James McCormack

เมื่อคุณเปลี่ยนรหัสไซต์คุณพยายามรีสตาร์ท IIS manager เพื่อดูว่า webroot เปลี่ยนไปหรือไม่ บางทีการกำหนดค่าอาจเชื่อมต่อกับ ID ซึ่งหมายความว่าการเปลี่ยนแปลง ID ยังแก้ไขสิ่งต่าง ๆ เช่นรูทเอกสารเป็นต้น
jishi

1
ใช่นั่นมัน! ฉันลืมรีสตาร์ทบริการ IIS (บรรทัดคำสั่ง iisreset / restart) ทำงานได้ดีหลังจากนั้น! โปรดอัปเดตคำตอบของคุณพร้อมข้อมูลนี้และฉันจะให้คำตอบที่คุณยอมรับ
James McCormack

เสร็จสิ้นการจัดการ ดีใจที่ได้ผลกับคุณ
jishi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.