2009-04-06 10 views
71

Tôi tự hỏi trong trường hợp nào tôi nên đặt mã khởi tạo ứng dụng vào số Application_Start()Init() trong tệp Global.asax của mình?Khi nào sử dụng Application_Start vs Init trong Global.asax?

Sự khác biệt giữa hai điều này dường như không rõ ràng đối với tôi, khác với Application_start được gọi trước, sau đó Init().

  • Tại sao tôi nên sử dụng cái kia?
  • Thực sự có tạo sự khác biệt không?
  • Những thay đổi nào trong trạng thái đơn đăng ký giữa hai sự kiện?

Cho đến nay con trỏ thực duy nhất tôi có thể tìm thấy là IHttpModule chỉ có một phương pháp Init(), vì vậy nếu những gì tôi đang làm may tại một số điểm phù hợp hơn để thực hiện IHttpModule tôi nên sử dụng phương pháp Init() của Global.asax, nếu không có gì khác cho tính nhất quán.

Trả lời

79

Từ MSDN docs:

Các phương pháp Application_Start và Application_End là phương pháp đặc biệt mà không đại diện cho HttpApplication sự kiện. ASP.NET gọi chúng một lần cho toàn bộ thời gian của miền ứng dụng, không phải cho mỗi cá thể HttpApplication.

Init:

gọi một lần cho tất cả các thể hiện của lớp HttpApplication sau khi tất cả module đã được tạo ra.

CẬP NHẬT: nếu bạn cần đảm bảo mã nhất định chỉ được gọi một lần trong ứng dụng. vòng đời, Application_Start là một giải pháp tốt hơn. Ví dụ: cấu hình log4net?

+3

Bit của câu hỏi tiếp theo: khi nào một phiên bản của HttpApplication được tạo? Tôi giả sử mỗi khi quy trình công nhân được khởi động lại và nó sẽ chứa một cá thể cho mỗi luồng công nhân? – roryf

+1

@roryf - asp.net duy trì một nhóm các cá thể ứng dụng có thể được sử dụng lại. Dưới nắp, yêu cầu được phục vụ bằng cách sử dụng CLR threadpool và yêu cầu đến sẽ được xếp hàng đợi vượt quá một ngưỡng nhất định. Tôi nghi ngờ họ khởi tạo hồ sơ cá thể ứng dụng đến mức ngưỡng đó vì hầu hết các trang web sẽ không thấy loại lưu lượng truy cập đó. Tôi nghi ngờ họ tạo ra các hồ bơi với một số ít các trường hợp và sau đó tăng kích thước của hồ bơi khi nhu cầu dốc lên. –

10

Có sự khác biệt giữa chúng. Sự kiện Application_Start() được gọi chỉ một lần trong khi phương thức Init() được gọi trên mỗi lần khi cá thể của ứng dụng được tạo ra.