2011-09-01 28 views
10

Tôi đang cố gắng phát hiện khi ứng dụng ASP.NET được tái chế do tệp web.config bị sửa đổi hoặc nhóm ứng dụng IIS được tái chế thủ công.Phát hiện khi ứng dụng ASP.NET tái chế

Ban đầu tôi nghĩ phương pháp Application_End ASP.NET của sẽ làm việc, và thử như sau:

protected void Application_End(object sender, EventArgs e) 
{ 
    File.AppendAllText("log.txt", DateTime.Now + "\n"); 
} 

Các tập tin được tạo ra lần đầu tiên file web.config được thay đổi, nhưng thay đổi tiếp theo không chớp sự biến cố. Tương tự như vậy, khi thử nghiệm trong IIS, việc tái tạo hồ sơ ứng dụng thủ công đầu tiên đã tạo ra tệp nhưng sau đó lại không - nó giống như sự kiện Application_End chỉ từng xảy ra một lần.

Làm cách nào để phát hiện mỗi khi hồ bơi/ứng dụng tái chế?

+6

Bạn không thể sử dụng Application_Start được chứ? Tôi đoán một số sự kiện như tắt máy hoặc mất điện sẽ không cho bạn biết khi Application_End được gọi. –

+1

Bạn có chắc chắn rằng bạn đã truy cập một trang trong ứng dụng sau khi thay đổi tệp web.config, vì vậy nó đã kết thúc và sau đó bắt đầu lại không? Bởi vì nếu nó không bao giờ bắt đầu lại, tôi có thể thấy rằng ngăn chặn Application_End bắn sau đó. – StriplingWarrior

Trả lời

4

Sau đây có thể là một chút hack nhưng bạn có thể sử dụng ứng dụng Cache để tìm hiểu. Mỗi lần tải trang, bạn có thể kiểm tra bộ nhớ cache cho một khóa cụ thể, nếu khóa không tồn tại thì bạn có thể coi đó là 'tái chế' và sau đó thêm khóa. Không phải là phương pháp tốt nhất nhưng có thể chỉ làm việc cho những gì bạn cần.

Ví dụ: Trong trang cơ sở của bạn Page_Load hoặc một nơi nào đó sẽ chạy với mọi yêu cầu, bạn có thể làm như sau:

if (HttpContext.Current.Cache["RecycleCheck"] != null) 
{ 
    // Add flag to cache 
    HttpContext.Current.Cache.Insert("RecycleCheck", "1", null, 
     DateTime.UtcNow.AddDays(2), // 2 days (most will recycle by then) 
     System.Web.Caching.Cache.NoSlidingExpiration); 

    // Do what you need because a recycle has happened 
} 

Phương pháp này sẽ không nhặt nó lên như rác xảy ra. Nó sẽ chỉ xác định một tái chế theo yêu cầu đầu tiên sau khi tái chế.

Application_Start sẽ là nơi đáng tin cậy nhất để thực hiện việc này nhưng nó cũng gặp vấn đề tương tự như sự cố xảy ra sau khi tái chế theo yêu cầu đầu tiên.

+1

Điều này có giải quyết được bất cứ điều gì 'Application_Start' không? – TheCodeKing

+0

@ TheCodeKing Không thực sự bởi đó là lý do tại sao tôi nói (thông báo dòng cuối cùng của câu trả lời của tôi) 'Application_Start' sẽ là nơi tốt nhất. Chỉ nếu vì một lý do nào đó có vấn đề gây ra 'Application_End' và' Start' không kích hoạt, đây là một thay thế hacky. – Kelsey

+1

Nó chỉ 'Application_Start' sẽ ** luôn luôn ** được gọi là, nó chỉ' Application_End' mà có thể không - trên ứng dụng tái chế ví dụ. – TheCodeKing

0

Tại sao bạn không làm điều gì đó như thế này. Điều chỉnh tần suất của công việc hẹn giờ để tăng độ chính xác trong việc xác định khi nào appPool tái chế.

private readonly Timer timer = new Timer(); 
private DateTime start; 
private string logFile; 

void Application_Start(object sender, EventArgs e) 
{ 
    start= DateTime.Now; 
    logFile = Server.MapPath(
      string.Concat("Log-",start.ToString("yyyyMMdd-HHmmss.fff"),".txt")); 

    timer.Interval = 1000; 
    timer.Elapsed += (s, ee) 
      => File.WriteAllText(logFile, 
      string.Concat("App Start :", start, " Last Alive: ", DateTime.Now)); 

    timer.Start(); 
} 
2

Câu trả lời tốt cho câu hỏi này đã được cung cấp trong câu hỏi stack overflow sau: how to detect if the current application pool is winding up

Để theo dõi hồ bơi ứng dụng tái chế bạn cần phải thực hiện các giao diện IRegisteredObject, gọi ApplicationManager.CreateObject để tạo ra một thể hiện của bạn và sau đó đăng ký nó với HostingEnvironment.RegisterObject trong khi khởi động ứng dụng của bạn.

Khi triển khai IRegisteredObject.Stop (bool) của đối tượng này được gọi là false làm tham số, đây là thông báo rằng miền ứng dụng đang bị tắt và đối tượng đó sẽ không được đăng ký (loại giống như vứt bỏ toàn cục) với gọi tới HostingEnvironment.UnregisterObject.

Vì vậy, việc sử dụng sự kiện này bạn có thể theo dõi khi hồ bơi ứng dụng được tái chế.

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