Khi nào sử dụng Application_Start so với Init trong Global.asax?


79

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

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

  • Tại sao tôi lại sử dụng cái này thay cho cái kia?
  • Liệu nó thực sự làm cho một sự khác biệt?
  • Những gì thay đổi trong trạng thái ứng dụng giữa hai sự kiện?

Cho đến nay, con trỏ thực sự duy nhất mà tôi có thể tìm thấy là IHttpModulechỉ có một Init()phương thức, vì vậy nếu những gì tôi đang làm tại một thời điểm nào đó có thể phù hợp hơn để triển khai, IHttpModuletôi nên sử dụng Init()phương thức Global.asax, nếu không có gì khác để nhất quán.

Câu trả lời:


89

Từ tài liệu MSDN :

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

Trong đó:

Được gọi một lần cho mọi phiên bản của lớp HttpApplication sau khi tất cả các mô-đun đã được tạo.

CẬP NHẬT: nếu bạn cần đảm bảo rằng một 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?


4
Một câu hỏi tiếp theo: khi nào một phiên bản của HttpApplication được tạo ra? Tôi giả sử mỗi lần khởi động lại worker-process và nó sẽ chứa một phiên bản cho mỗi worker-thread?
roryf

2
@roryf - asp.net duy trì một nhóm các phiên bản ứng dụng có thể được sử dụng lại. Dưới vỏ bọc, các yêu cầu được phục vụ bằng cách sử dụng nhóm luồng CLR và các 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 nhóm phiên bản ứ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ờ rằng họ tạo hồ bơi với một số lượng nhỏ các trường hợp và sau đó tăng kích thước của hồ bơi khi nhu cầu tăng lên.
Joel Fillmore

12

Đúng

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.