2009-05-08 25 views
50

Kịch bản: Tôi đã ứng dụng ASP.NET cấp doanh nghiệp n-Tier được triển khai bằng cách sử dụng Dự án triển khai web. Tất cả các tầng tạo ra các assembly độc lập được ứng dụng ASP.NET sử dụng.Làm thế nào để giữ cho các assembly ASP.NET trong AppDomain còn sống?

Sự cố: Khi tôi chạy ứng dụng. lần đầu tiên sau khi triển khai phải mất rất nhiều thời gian để tải các assembly phụ thuộc vào bộ nhớ. Nhưng một khi tải ứng dụng ánh sáng nhanh của nó. Trong trường hợp nếu không có người dùng nào truy cập vào ứng dụng, IIS dỡ các assembly khỏi bộ nhớ và khi người dùng cố gắng truy cập vào ứng dụng sau này, nó sẽ tải tất cả các assembly một lần nữa lấy cùng một lượng thời gian để tải phải làm như vậy lần đầu tiên.

Tôi đang tìm một giải pháp cho phép tôi giữ cho các hội đồng của tôi được tải vào bộ nhớ liên tục ghi đè bản chất dễ bay hơi của các hội đồng về phía bộ nhớ.

Hoặc bất kỳ giải pháp nào khác cho phép người dùng của tôi vui vẻ sử dụng ứng dụng để giải quyết vấn đề đã đề cập.

Trả lời

72

Trong IIS 6, hãy đi tới phần Hồ bơi ứng dụng và nhấp chuột phải> Thuộc tính trên nhóm lưu trữ ứng dụng ASP.NET được đề cập. Chuyển đến tab Hiệu suất và bỏ chọn "Quy trình công nhân tắt máy sau khi không hoạt động cho:"

Trong IIS 7, đi tới ngăn Kết nối và tìm Hồ bơi ứng dụng và chọn Cài đặt nâng cao cho nhóm lưu trữ ứng dụng của bạn. Tìm thuộc tính "Hết thời gian chờ" và đặt thành "0" (điều này sẽ vô hiệu hóa nó).

Mặc định là 20 phút không hoạt động. Bằng cách bỏ chọn hộp, một khi AppDomain của bạn được tải bởi worker process, nó sẽ không bao giờ chết (trừ khi bạn giết quá trình hoặc một cái gì đó tất nhiên). Theo mặc định, IIS sẽ recycle the process khi đạt đến giới hạn nào đó, chẳng hạn như nắp bộ nhớ, nhưng nó cũng sẽ bắt đầu một giới hạn mới và "pha" tất cả các yêu cầu đến cho đến khi yêu cầu cũ không được sử dụng, để giảm thiểu sự gián đoạn.

Tôi cũng đã viết một lớp nhỏ C# sẽ keep your ASP.NET application alive (alternate archived version) trong các trường hợp bình thường. Vì nó chạy trong ứng dụng, rõ ràng là nó không thể ngăn IIS hoặc bất cứ thứ gì khác giết chết rõ ràng quy trình, nhưng nó sẽ giữ cho ứng dụng "nóng", ví dụ: ứng dụng sẽ không bao giờ ngừng hoạt động đủ lâu để IIS quyết định tắt nó đi.

Nếu bạn không có quyền kiểm soát trực tiếp cấu hình IIS (ví dụ như máy chủ chia sẻ), bạn nên đặt một ứng dụng nhỏ chạy trên một hệ thống riêng biệt. x phút để giữ hồ bơi ứng dụng khỏi thời gian chờ. Không có gì lạ mắt - một đơn giản WebRequest và một vòng lặp while() trong ứng dụng bảng điều khiển sẽ thực hiện.

+0

Tôi có một máy chủ dùng chung. Tôi không có quyền truy cập vào cấu hình IIS trong chi tiết đó. Bất kỳ cách nào chúng ta có thể làm điều này bằng mã hoặc cấu hình ở cấp ứng dụng? –

+0

@s_ruchit sự kiểm soát của hồ bơi ứng dụng và quy trình công nhân là ở phạm vi IIS, vì vậy không. Các giải pháp phổ biến nhất trong tình huống của bạn là có một ứng dụng sống trên một số máy tính khác (nói, một máy trạm luôn hoạt động) truy cập một trang trên trang web của bạn sau mỗi 10-15 phút. Một dịch vụ mà tôi đã không đích thân sử dụng mà tuyên bố để làm điều đó cho bạn có thể được tìm thấy tại http://www.keepaliveforever.com/ –

+0

@ Rex M: Đó là tuyệt vời. Tôi không bao giờ thougt ra khỏi hộp. Nó có thể rất đơn giản! Cảm ơn một tấn. Trong thực tế, chúng tôi có thể viết ứng dụng http của riêng mình để giữ cho ứng dụng luôn hoạt động. –

0

Tôi đã viết một ứng dụng giao diện điều khiển C# nhỏ giữ 4 trang web của tôi hoạt động cứ 10 phút một lần qua cửa sổ lập lịch tác vụ. Cuộc sống là một lần nữa tốt. Chúng tôi không chạy các ứng dụng từ 2-5am chỉ để phục vụ có thể làm bất kỳ dọn dẹp bộ nhớ, nếu nó thậm chí còn quan trọng. đối với các trang web của chúng tôi, hiếm khi có ai vào những giờ đó.

+0

Tôi cũng đã làm điều đó nhưng cứ 1 phút một lần - ứng dụng sẽ bị hỏng. – Azimuth

3

Một trong những ưu điểm của ASP .net là khả năng tạo ra các đối tượng tĩnh (được chia sẻ) của các đối tượng.

Để tránh sự cần thiết của một quá trình bên ngoài, bạn có thể tạo một bộ đếm thời gian tĩnh trong (ví dụ) global.asax gọi một trang trên tên miền với một WebRequest đơn giản. Bằng cách này, trang web vẫn tiếp tục hoạt động cho đến khi thiết lập lại hồ sơ bằng tay được thực hiện.

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