2010-07-07 33 views
6

Tôi có xác thực Mẫu và tôi cần một đối tượng tùy chỉnh được lưu trữ trong HttpContext.Current.User và trong Thread.CurrentPrincipal.PostAuthenticateRequest cháy nhiều lần

Để có được điều này, tôi lắng nghe sự kiện PostAuthenticateRequest, sau đó đọc từ DB tất cả dữ liệu người dùng tôi cần được lưu trữ trong HttpContext.Current.User và trong Thread.CurrentPrincipal, sau đó tôi nhanh chóng tùy chỉnh đối tượng IPrincipal và IIdentity và gán chúng đến các địa điểm trên.

Vấn đề là vì một lý do PostAuthenticateRequest bắn nhiều lần cho một yêu cầu duy nhất .. Điều này gây ra không cần thiết DB roundtrips rằng hiệu suất tổn thương ..

Làm thế nào tôi nên giải quyết này? (ASP.NET MVC 2)

Cảm ơn.

Trả lời

5

Bạn có chắc chắn rằng nó đang chạy nhiều lần cho một yêu cầu không? Hãy nhớ rằng, mọi tài nguyên như hình ảnh và tờ mẫu được tham chiếu trên trang của bạn sẽ kích hoạt sự kiện này vì chúng được coi là yêu cầu riêng biệt. Bạn nên lưu trữ một thời gian ngắn các đối tượng tùy chỉnh và kiểm tra sự tồn tại của chúng trong bộ đệm và chỉ chuyển sang DB nếu không có.

Bạn cần triển khai một số khóa trên bộ nhớ cache vì các yêu cầu này thường xảy ra rất gần nhau.

+0

Ồ, vâng! Điều với các nguồn lực và vv trượt tâm trí của tôi !!! Cảm ơn bạn đã bồi dưỡng! Tôi đã xem xét bộ nhớ đệm. Nhưng nó cũng đi với hàm ý. Ví dụ, tôi đọc từ DB và lưu trữ trong quyền của người dùng chính. Có chúng trong bộ nhớ cache không phải là ý tưởng rất tốt trong trường hợp Admin quyết định thay đổi quyền cho người dùng - quyền người dùng được lưu trong bộ nhớ cache sẽ không được cập nhật cho đến khi người dùng đăng xuất/đăng nhập .. Cần thử ý tưởng của bạn bằng bộ nhớ đệm "ngắn gọn". Có vẻ như nó phải phù hợp với hóa đơn .. Cảm ơn rất nhiều! – Ant

+0

Bạn có thể cập nhật bộ nhớ cache cho người dùng hiện tại trên Page_Init. Sau đó, nó sẽ được tải lại từ DB chỉ một lần cho mỗi yêu cầu trang. Điều này sẽ luôn xảy ra trước khi bất kỳ yêu cầu nào khác được yêu cầu vì trang chưa được hiển thị. –

1

Chỉ cần sử dụng thẻ trong web.config của bạn để xóa mọi xác thực khỏi tập lệnh, css và thư mục hình ảnh của bạn. Ví dụ:

<system.web> 
... 
</system.web> 

<location path="~/Scripts"> 
    <system.web> 
     <authorization> 
     <allow users="*"/> 
     </authorization> 
    </system.web> 
</location> 
+2

Nó sẽ không giúp gây ra sự kiện này kích hoạt trên mỗi yêu cầu bất kể bạn truy cập trang được giới hạn hay không. – jlp

Các vấn đề liên quan