Tôi đã tạo ra một mô-đun http và trong khi gỡ lỗi tôi nhận thấy một cái gì đó mà lúc đầu (ít nhất) có vẻ như hành vi kỳ lạ.Phương thức HttpModule Init được gọi nhiều lần - tại sao?
Khi tôi đặt điểm ngắt trong phương pháp init của httpmodule tôi có thể thấy phương thức init của mô-đun http được gọi nhiều lần mặc dù tôi chỉ khởi động trang web để gỡ lỗi và thực hiện một yêu cầu duy nhất (đôi khi nó là chỉ nhấn 1 lần, thời gian khác tới 10 lần).
Tôi biết rằng tôi sẽ mong đợi một số trường hợp của HttpApplication đang chạy và cho mỗi mô-đun http sẽ được tạo ra, nhưng khi tôi yêu cầu một trang duy nhất nó sẽ được xử lý bởi một đối tượng ứng dụng http duy nhất và do đó chỉ cháy các sự kiện được kết hợp một lần, nhưng nó vẫn kích hoạt các sự kiện vài lần cho mỗi yêu cầu không có ý nghĩa - ngoài nó phải được thêm vài lần trong httpApplication đó - có nghĩa là phương thức init httpmodule giống nhau được gọi mỗi lần và không một ứng dụng http mới được tạo ra mỗi khi nó chạm vào điểm ngắt của tôi (xem ví dụ mã của tôi ở phía dưới, v.v.).
Điều gì có thể xảy ra ở đây? có phải vì tôi đang gỡ lỗi và đặt điểm ngắt trong mô-đun http không? Nó đã nhận thấy rằng có vẻ như rằng nếu tôi khởi động trang web để gỡ lỗi và nhanh chóng bước qua breakpoint trong httpmodule nó sẽ chỉ nhấn phương pháp init một lần và cùng đi cho eventhandler này. Quay lại đầu trang | Nếu thay vào đó, hãy để nó treo tại điểm ngắt trong vài giây, phương thức init được gọi nhiều lần (có vẻ như nó phụ thuộc vào thời gian tôi đợi trước khi bước qua điểm ngắt). Có lẽ điều này có thể là một số tính năng xây dựng để đảm bảo rằng httpmodule được khởi tạo và ứng dụng http có thể phục vụ các yêu cầu, nhưng nó cũng có vẻ giống như một cái gì đó mà có thể có hậu quả thảm khốc. Điều này có vẻ hợp lý, vì nó có thể đang cố gắng hoàn thành yêu cầu và vì tôi đã thiết lập điểm ngắt nó nghĩ rằng đã xảy ra lỗi và thử gọi lại phương thức init? nó có thể xử lý yêu cầu không?
Nhưng đây có phải là những gì đang xảy ra và mọi thứ đều ổn (tôi chỉ đoán), hay nó là một vấn đề thực sự?
Điều tôi đặc biệt quan tâm là nếu một thứ gì đó khiến nó treo trên máy chủ "sản xuất/sống" trong vài giây, rất nhiều trình xử lý sự kiện được thêm vào init và do đó mỗi yêu cầu đến trang đột nhiên kích hoạt trình quản lý sự kiện vài lần.
Hành vi này có thể nhanh chóng đưa mọi trang web xuống.
Tôi đã xem mã "." Gốc .net được sử dụng cho httpmodules cho formsauthentication và rolemanagermodule v.v. nhưng mã của tôi không khác biệt gì với các mô-đun đó.
Mã của tôi trông như thế này.
public void Init(HttpApplication app)
{
if (CommunityAuthenticationIntegration.IsEnabled)
{
FormsAuthenticationModule formsAuthModule = (FormsAuthenticationModule) app.Modules["FormsAuthentication"];
formsAuthModule.Authenticate += new FormsAuthenticationEventHandler(this.OnAuthenticate);
}
}
đây là một ví dụ làm thế nào nó được thực hiện trong RoleManagerModule từ NET framework
public void Init(HttpApplication app)
{
if (Roles.Enabled)
{
app.PostAuthenticateRequest += new EventHandler(this.OnEnter);
app.EndRequest += new EventHandler(this.OnLeave);
}
}
Làm bất cứ ai biết điều gì đang xảy ra vậy?
(tôi chỉ hy vọng ai đó ngoài kia có thể cho tôi biết tại sao điều này đang xảy ra và đảm bảo với tôi rằng mọi thứ đều hoàn toàn tốt đẹp) :)
UPDATE:
Tôi đã cố gắng để thu hẹp vấn đề và cho đến nay tôi đã thấy rằng phương pháp Init được gọi là luôn luôn trên một đối tượng mới của mô-đun http của tôi (contary với những gì tôi nghĩ trước).
Tôi có vẻ như yêu cầu đầu tiên (khi khởi động trang) tất cả các đối tượng HttpApplication được tạo và các mô-đun của nó đều cố gắng phân phát yêu cầu đầu tiên và do đó tất cả đều nhấn tổ chức sự kiện đang được thêm vào. Tôi không thể thực sự tìm ra lý do tại sao điều này xảy ra.
Nếu tôi yêu cầu một trang khác, tất cả các ứng dụng của HttpApplication được tạo ra (và moduless của họ) sẽ lại cố gắng phục vụ yêu cầu khiến nó chạm vào eventhandler nhiều lần. Nhưng nó cũng có vẻ như là nếu tôi sau đó nhảy trở lại trang đầu tiên (hoặc một cái khác) chỉ có một HttpApplication sẽ bắt đầu để chăm sóc yêu cầu và tất cả mọi thứ như mong đợi - miễn là tôi không để cho nó treo ở một điểm ngắt.
Nếu tôi để nó treo tại điểm ngắt, nó bắt đầu tạo đối tượng HttpApplication mới và bắt đầu thêm HttpApplications (nhiều hơn 1) để phục vụ/xử lý yêu cầu (hiện đang được phục vụ bởi HttpApplication hiện đang bị dừng tại điểm ngắt).
Tôi đoán hoặc hy vọng rằng đó có thể là cách thông minh "đằng sau hậu trường" giúp phân phối và xử lý tải và/hoặc lỗi. Nhưng tôi không có đầu mối. Tôi hy vọng một số trong đó có thể đảm bảo với tôi rằng nó là hoàn toàn tốt đẹp và làm thế nào nó được cho là?
Tôi nhìn thấy hành vi này trong HttpModule của chúng tôi cũng như –
John: Tôi đã quên đóng chương trình này. Nó xảy ra (ít nhất là trong trường hợp của tôi) bởi vì các mô-đun được nhấn bởi mỗi yêu cầu duy nhất trình duyệt làm cho bất kỳ tài nguyên (hình ảnh, javascripts, stylesheets). Lý do tại sao nó được nhấn là mô-đun định tuyến được sử dụng trong vv MVC. Tất cả các yêu cầu cần phải được xử lý bởi các mô-đun định tuyến và cho tất cả các yêu cầu nhấn mô-đun không may. Tôi đã hỏi một câu hỏi về điều này, nhưng không ai trả lời. – MartinF