2009-02-08 7 views
5

Kịch bản:Nâng cấp từ .NET 3.0 lên 3.5: Các trang web được đặt thành StateServer sẽ hoàn nguyên về InProc khi trong Web Garden

Lấy máy chủ chạy .NET 3.0 và ASP.NET Web đang chạy trong một ứng dụng có Web vườn được kích hoạt (số lượng các quy trình: 3). Cấu hình web.config như sau:

 
    <sessionState 
     cookieless="UseCookies" 
     cookieName=".authz" 
     mode="StateServer" 
     regenerateExpiredSessionId="true" 
     stateConnectionString="tcpip=127.0.0.1:42424" 
     timeout="60" 
     useHostingIdentity="true" /> 

Bây giờ hãy nâng cấp máy lên .NET 3.5 SP1. Khởi động lại máy chủ. Kết quả: các phiên không còn được duy trì trên các phiên bản của w3wp.exe, như thể tất cả các phiên đã được hoàn nguyên về InProc. Giảm 1 quy trình công nhân là giải pháp thay thế hiện tại.

Điều kỳ lạ: Mã giống nhau trên các trải nghiệm máy chủ khác nhau không có vấn đề gì. Tôi đã gặp vấn đề này trước đây, nhưng nó đã biến mất một cách kỳ diệu sau khi khởi động lại. Tôi đã khởi động lại một lần, nhưng không có niềm vui cho đến nay.

So sánh hai tệp machine.configs và web.configs của hai máy chủ: giống hệt nhau.

Someone else has experienced this problem, nhưng không có câu trả lời ở đó.

Bất kỳ ý tưởng nào? Tôi là thực sự là được đặt trên trang này.

Trả lời

11

Vì vậy, điều này thật tuyệt vời.

vấn đề này dường như xảy ra khi tất cả các điều kiện sau là đúng:

  • Bạn đang chạy Windows Server 2003 (IIS 6.0) và một trang web ASP.NET 2.0.
  • Trang Web được định cấu hình để sử dụng Web Gardens, nơi số lượng quy trình công nhân tối đa lớn hơn 1. Vì lý do này, bạn đã định cấu hình ứng dụng của mình để sử dụng bộ nhớ phiên quá trình; trong trường hợp này, Dịch vụ Trạng thái ASP.NET đang chạy trên máy cục bộ.
  • Nhận dạng hồ bơi ứng dụng được đặt thành MẠNG DỊCH VỤ MẠNG nhưng với tài khoản người dùng tùy chỉnh, đặc quyền thấp mà bạn đã tạo cho mỗi deployment best practice.
  • Bạn chạy trình cài đặt cập nhật khuôn khổ .NET; trong trường hợp của tôi, đây là bản cập nhật từ .NET 3.0 đến .NET 3.5 SP1.

Khi nâng cấp kết thúc và bạn khởi động lại máy chủ, bạn thấy rằng các biến phiên thường bị mất khi làm mới trang, vì bạn chỉ nhận được 1/3 cơ hội nhận quy trình làm việc ban đầu yêu cầu. Nhưng điều này không quan trọng, vì bạn đang sử dụng dịch vụ trạng thái ASP.NET. Những gì đã phá vỡ?

Khi sử dụng dịch vụ trạng thái ASP.NET, ASP.NET sử dụng giá trị được gọi là machineKey để mã hóa và/hoặc băm tất cả dữ liệu phiên được lưu trữ (Tôi không biết mã hóa hoặc băm hay cả hai) không phải là một sự khác biệt quan trọng cho cuộc thảo luận này). Điều này là để khi bất kỳ quá trình nào của nhân viên yêu cầu dữ liệu từ dịch vụ bằng cách sử dụng một định danh phiên, nó có thể chắc chắn rằng dữ liệu không bị giả mạo trong khi nó đang được lưu trữ trong nguồn dữ liệu ngoài.

Nếu bạn đang ở trong một trang trại, bạn có thể có một static machineKey được xác định trong tệp web.config của mình và sự cố này không xảy ra. Nhưng đối với một kịch bản web vườn đơn, bạn có thể dựa vào cài đặt mặc định machineKey, được đặt thành AutoGenerate,IsolateApps cho các ứng dụng ASP.NET 2.0. Điều này có nghĩa là ASP.NET sẽ tự động tạo ra một khóa máy duy nhất cho nhóm ứng dụng của bạn.Nó tạo lại khóa này theo một số thuật toán, nhưng điều đó không quan trọng cho cuộc thảo luận này.

Giá trị được tạo thường được lưu trữ trong sổ đăng ký theo HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0\AutoGenKeys\{SID of the Application Pool Identity}. Nhưng trình cài đặt .NET Framework không chính xác (tôi tin đây là lỗi) phá hủy khoá đăng ký này và, để thêm sự xúc phạm vào thương tích, hãy đặt lại quyền trên khóa này sao cho danh tính hồ bơi ứng dụng tùy chỉnh của bạn không thể ghi vào mục đăng ký khi nó để tạo khóa máy mới.

Kết quả là mỗi quy trình công nhân quay lên trong khu vườn web đang sử dụng bản sao bộ nhớ trong máy của chính nó mà nó tạo ra đúng lúc, tạo tình huống trang trại một cách hiệu quả một cách tình cờ. Ví dụ, quy trình công nhân A quay lên, thấy rằng không có mục nhập AutoGenKey nào tồn tại (thực tế, thậm chí không thể đọc nó), tự tạo và bắt đầu sử dụng dữ liệu đó vào dữ liệu băm được gửi tới Dịch vụ trạng thái ASP.NET. Nó cố gắng lưu khóa máy mới này vào mục đăng ký nhưng không thành công. Quá trình công nhân B quay lên, thấy rằng không có mục nhập AutoGenKey nào tồn tại, tự tạo và bắt đầu sử dụng rằng vào dữ liệu băm ... bạn sẽ biết nơi này đang diễn ra.

Kết quả là bây giờ bạn có dữ liệu phiên được băm với ba khóa máy khác nhau. Mặc dù dữ liệu cho số nhận dạng phiên tồn tại, hai trong số ba quy trình của công nhân sẽ từ chối dữ liệu đó là không hợp lệ/bị giả mạo vì nó đang sử dụng khóa riêng của nó.

Bạn có thể giải quyết vấn đề này bằng cách đặt rõ ràng tùy chỉnh machineKey trong tệp web.config của mình.

Hoặc bạn có thể chạy lại aspnet_regiis.exe -ga MachineName\ApplicationPoolUserName tại Dấu nhắc lệnh để sửa các quyền bị hỏng.

Sự cố của bạn được giải quyết. Thời gian để đi ngủ.


CẬP NHẬT 30 tháng 6: mỗi báo cáo của tôi về vấn đề này trên Microsoft Connect, Microsoft đã cho biết rằng họ đã cố định các cài đặt như rằng hành vi này sẽ không xảy ra bắt đầu với những nâng cấp để NET 4. Nó vẫn có thể xảy ra cho tất cả các bản nâng cấp 3.0/3.5 trong tương lai, vì vậy tôi sẽ để lại câu hỏi/câu trả lời này.

+0

bạn vừa lưu tôi rất nhiều thời gian. Tôi đã ở đây trong một vài giờ vì vậy cảm ơn. – Middletone

+0

Tuyệt vời Nicholas, chúng tôi đã phải chịu ngay bây giờ, trong khi cố gắng để tung ra một trang web sản xuất trang web, chính xác cùng một vấn đề ... cảm ơn thông tin hữu ích này. –